Clementine-audio-player-Mac.../3rdparty/vreen/vreen/src/api/contact.h

244 lines
7.9 KiB
C++

/****************************************************************************
**
** Vreen - vk.com API Qt bindings
**
** Copyright © 2012 Aleksey Sidorov <gorthauer87@ya.ru>
**
*****************************************************************************
**
** $VREEN_BEGIN_LICENSE$
** This program 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, either version 3 of the License, or
** (at your option) any later version.
**
** This program 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 General Public License
** along with this program. If not, see http://www.gnu.org/licenses/.
** $VREEN_END_LICENSE$
**
****************************************************************************/
#ifndef VK_USER_H
#define VK_USER_H
#include "client.h"
#include <QStringList>
#include <QVariant>
namespace Vreen {
#define VK_COMMON_FIELDS QLatin1String("first_name") \
<< QLatin1String("last_name") \
<< QLatin1String("online") \
<< QLatin1String("photo") \
<< QLatin1String("photo_medium") \
<< QLatin1String("photo_medium_rec") \
<< QLatin1String("photo_big") \
<< QLatin1String("photo_big_rec") \
<< QLatin1String("lists") \
<< QLatin1String("activity")
#define VK_EXTENDED_FIELDS QLatin1String("sex") \
<< QLatin1String("bdate") \
<< QLatin1String("city") \
<< QLatin1String("country") \
<< QLatin1String("education") \
<< QLatin1String("can_post") \
<< QLatin1String("contacts") \
<< QLatin1String("can_see_all_posts") \
<< QLatin1String("can_write_private_message") \
<< QLatin1String("last_seen") \
<< QLatin1String("relation") \
<< QLatin1String("nickname") \
<< QLatin1String("wall_comments") \
#define VK_GROUP_FIELDS QLatin1String("city") \
<< "country" \
<< "place" \
<< "description" \
<< "wiki_page" \
<< "members_count" \
<< "counters" \
<< "start_date" \
<< "end_date" \
<< "can_post" \
<< "activity"
#define VK_ALL_FIELDS VK_COMMON_FIELDS \
<< VK_EXTENDED_FIELDS
class Client;
class ContactPrivate;
class VK_SHARED_EXPORT Contact : public QObject
{
Q_OBJECT
Q_DECLARE_PRIVATE(Contact)
Q_ENUMS(Type)
Q_ENUMS(Status)
Q_PROPERTY(int id READ id CONSTANT)
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
Q_PROPERTY(Type type READ type CONSTANT)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString photoSource READ defaultSource NOTIFY photoSourceChanged)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString photoSourceBig READ bigSource NOTIFY photoSourceChanged)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString _q_photo READ smallSource WRITE setSmallSource DESIGNABLE false)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString _q_photo_medium READ mediumSource WRITE setMediumSource DESIGNABLE false)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString _q_photo_medium_rec READ mediumSourceRec WRITE setMediumSourceRec DESIGNABLE false)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString _q_photo_big READ bigSource WRITE setBigSource DESIGNABLE false)
Q_PRIVATE_PROPERTY(Contact::d_func(), QString _q_photo_big_rec READ bigSourceRec WRITE setBigSourceRec DESIGNABLE false)
public:
enum PhotoSize {
PhotoSizeSmall,
PhotoSizeMedium,
PhotoSizeBig,
PhotoSizeMediumRec,
PhotoSizeBigRec
};
enum Type {
BuddyType,
GroupType,
ChatType
};
enum Status {
Online,
Away,
Offline,
Unknown
};
Contact(int id, Client *client);
Contact(ContactPrivate *data);
virtual ~Contact();
virtual QString name() const = 0;
Type type();
int id() const;
Client *client() const;
Q_INVOKABLE QString photoSource(PhotoSize size = PhotoSizeSmall) const;
void setPhotoSource(const QString &source, PhotoSize size = PhotoSizeSmall);
static void fill(Contact *contact, const QVariantMap &data);
signals:
void nameChanged(const QString &name);
void photoSourceChanged(const QString &source, Vreen::Contact::PhotoSize);
protected:
QScopedPointer<ContactPrivate> d_ptr;
};
#define VK_CONTACT_TYPE(ContactType) \
public: \
static Contact::Type staticType() { return ContactType; } \
virtual Contact::Type type() const { return staticType(); } \
private:
class BuddyPrivate;
class VK_SHARED_EXPORT Buddy : public Contact
{
Q_OBJECT
Q_DECLARE_PRIVATE(Buddy)
VK_CONTACT_TYPE(BuddyType)
Q_PROPERTY(QString fistName READ firstName NOTIFY firstNameChanged)
Q_PROPERTY(QString lastName READ lastName NOTIFY lastNameChanged)
Q_PROPERTY(bool online READ isOnline NOTIFY onlineChanged)
Q_PROPERTY(QStringList tags READ tags NOTIFY tagsChanged)
Q_PROPERTY(QString activity READ activity NOTIFY activityChanged)
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
Q_PROPERTY(bool isFriend READ isFriend NOTIFY isFriendChanged)
//private properties
Q_PROPERTY(QString _q_first_name READ firstName WRITE setFirstName DESIGNABLE false)
Q_PROPERTY(QString _q_last_name READ lastName WRITE setLastName DESIGNABLE false)
Q_PROPERTY(bool _q_online READ isOnline WRITE setOnline DESIGNABLE false STORED false)
Q_PRIVATE_PROPERTY(d_func(), QVariantList _q_lists READ lists WRITE setLists DESIGNABLE false)
Q_PRIVATE_PROPERTY(d_func(), QString _q_activity READ getActivity WRITE setActivity DESIGNABLE false)
public:
//TODO name case support maybe needed
QString firstName() const;
void setFirstName(const QString &firstName);
QString lastName() const;
void setLastName(const QString &lastName);
bool isOnline() const;
void setOnline(bool set);
virtual QString name() const;
QStringList tags() const;
QString activity() const;
Status status() const;
void setStatus(Status status);
bool isFriend() const;
void setIsFriend(bool set);
public slots:
void update(const QStringList &fields);
void update();
SendMessageReply *sendMessage(const QString &body, const QString &subject = QString());
Reply *addToFriends(const QString &reason = QString());
Reply *removeFromFriends();
signals:
void firstNameChanged(const QString &name);
void lastNameChanged(const QString &name);
void onlineChanged(bool isOnline);
void tagsChanged(const QStringList &tags);
void activityChanged(const QString &activity);
void statusChanged(Vreen::Contact::Status);
void isFriendChanged(bool isFriend);
protected:
Buddy(int id, Client *client);
friend class Roster;
friend class RosterPrivate;
Q_PRIVATE_SLOT(d_func(), void _q_friends_add_finished(const QVariant &response))
Q_PRIVATE_SLOT(d_func(), void _q_friends_delete_finished(const QVariant &response))
};
class GroupPrivate;
class VK_SHARED_EXPORT Group : public Contact
{
Q_OBJECT
Q_DECLARE_PRIVATE(Group)
VK_CONTACT_TYPE(GroupType)
Q_PROPERTY(QString _q_name READ name WRITE setName DESIGNABLE false)
public:
virtual QString name() const;
void setName(const QString &name);
public slots:
void update();
protected:
Group(int id, Client *client);
friend class GroupManager;
};
//TODO group chats
class GroupChat;
typedef QList<Contact*> ContactList;
typedef QList<Buddy*> BuddyList;
typedef QList<Group*> GroupList;
//contact's casts
template <typename T>
Q_INLINE_TEMPLATE T contact_cast(Contact *contact)
{
//T t = reinterpret_cast<T>(0);
//if (t->staticType() == contact->type())
// return static_cast<T>(contact);
return qobject_cast<T>(contact);
}
} // namespace Vreen
Q_DECLARE_METATYPE(Vreen::Contact*)
Q_DECLARE_METATYPE(Vreen::Buddy*)
Q_DECLARE_METATYPE(Vreen::Group*)
#endif // VK_USER_H