// ---------------------------------------------------------------------------80
//                ICQ plugin for Miranda Instant Messenger
//                ________________________________________
//
// Copyright © 2000-2001 Richard Hughes, Roland Rabien, Tristan Van de Vreede
// Copyright © 2001-2002 Jon Keating, Richard Hughes
// Copyright © 2002-2004 Martin Öberg, Sam Kothari, Robert Rainwater
// Copyright © 2004-2010 Joe Kucera
// Copyright © 2012-2018 Miranda NG team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// -----------------------------------------------------------------------------

#ifndef __ICQ_SERVLIST_H
#define __ICQ_SERVLIST_H

// actions:
#define SSA_CHECK_ROSTER      0     // request serv-list
#define SSA_VISIBILITY        1     // update visibility
#define SSA_CONTACT_UPDATE    2     // update contact's details
#define SSA_GROUP_RENAME      5     // rename group
#define SSA_PRIVACY_ADD       0xA   // add privacy item
#define SSA_PRIVACY_REMOVE    0xB   // remove privacy item
#define SSA_CONTACT_ADD       0x10  // add contact w/o auth
#define SSA_CONTACT_SET_GROUP 0x12  // move to group
#define SSA_CONTACT_REMOVE    0x13  // delete contact
#define SSA_CONTACT_FIX_AUTH  0x40  // reuploading contact for auth re-request
#define SSA_GROUP_ADD         0x15  // create group
#define SSA_GROUP_REMOVE      0x16  // delete group
#define SSA_GROUP_UPDATE      0x17  // update group
#define SSA_SERVLIST_ACK      0x20  // send proto ack only (UploadUI)
#define SSA_SETAVATAR         0x30
#define SSA_REMOVEAVATAR      0x31
#define SSA_IMPORT            7
#define SSA_ACTION_GROUP      0x80  // grouped action

struct CIcqProto;
// callback prototypes for pending operation mechanism:
typedef int (__cdecl CIcqProto::*PENDING_GROUP_CALLBACK)(const char* pszGroup, WORD wGroupId, LPARAM lParam, int nResult);
typedef int (__cdecl CIcqProto::*PENDING_CONTACT_CALLBACK)(MCONTACT hContact, WORD wContactId, WORD wGroupId, LPARAM lParam, int nResult);

// cookie struct for SSI actions
struct cookie_servlist_action
{
	MCONTACT hContact;
	char *szGroup;
	WORD wContactId;
	WORD wGroupId;
	char *szGroupName;
	WORD wNewContactId;
	WORD wNewGroupId;
	int dwAction;
	LPARAM lParam;
	int dwGroupCount;
	cookie_servlist_action **pGroupItems;
};

// server id type groups
#define SSIT_ITEM             0x00000000
#define SSIT_GROUP            0x00010000

// server id flags
#define SSIF_UNHANDLED        0x01000000


// pending operations
#define PENDING_RESULT_SUCCESS  0x00
#define PENDING_RESULT_INLINE   0x01
#define PENDING_RESULT_FAILED   0x0F
#define PENDING_RESULT_PURGE    0x10

// serv-list update board
#define SSOG_SINGLE           0x00010000
#define SSOG_DOUBLE           0x00020000

#define SSOF_CONTACT          0x00800000
#define SSOF_BEGIN_OPERATION  0x00100000
#define SSOF_END_OPERATION    0x00200000
#define SSOF_IMPORT_OPERATION 0x00400000

#define SSOP_ITEM_ACTION      0x01000000 | SSOG_SINGLE
// SSA_PRIVACY_ADD
// SSA_CONTACT_ADD
// SSA_CONTACT_UPDATE
// SSA_VISIBILITY
// SSA_PRIVACY_REMOVE
// SSA_CONTACT_REMOVE
// SSA_SETAVATAR
// SSA_REMOVEAVATAR
#define SSOP_GROUP_ACTION     0x02000000 | SSOG_SINGLE
// SSA_GROUP_ADD
// SSA_GROUP_RENAME
// SSA_GROUP_UPDATE
// SSA_GROUP_REMOVE
#define SSO_CONTACT_SETGROUP  0x04000000 | SSOG_DOUBLE
// SSA_CONTACT_SET_GROUP
#define SSO_CONTACT_FIXAUTH   0x06000000 | SSOG_DOUBLE
// SSA_CONTACT_FIX_AUTH

#define SSO_BEGIN_OPERATION   0x80000000
#define SSO_END_OPERATION     0x40000000

#define SSOF_SEND_DIRECTLY    0x10000000

#define SSOF_ACTIONMASK       0x0000FFFF
#define SSOF_GROUPINGMASK     0x0F0FFFFF


#define MAX_SERVLIST_PACKET_ITEMS 200

// server-list request handler item
struct servlistgroupitem
{ // generic parent
  DWORD dwOperation;
  cookie_servlist_action* cookie;
  icq_packet packet;
  // perhaps add some dummy bytes
};

struct servlistgroupitemdouble: public servlistgroupitem
{
  icq_packet packet2;
  WORD wAction2;
};

struct ssiqueueditems
{
  time_t tAdded;
  int dwTimeout;
  int nItems;
  servlistgroupitem* pItems[MAX_SERVLIST_PACKET_ITEMS];
};


// cookie structs for pending records
struct servlistpendingoperation
{
  DWORD flags;
  PENDING_GROUP_CALLBACK callback;
  LPARAM param;
};

struct servlistpendingitem
{
  int nType;
  MCONTACT hContact;
  char* szGroup;
  WORD wContactID;
  WORD wGroupID;

  servlistpendingoperation* operations;
  int operationsCount;
};


#endif /* __ICQ_SERVLIST_H */