/*

Jabber Protocol Plugin for Miranda IM
Copyright ( C ) 2002-04  Santithorn Bunchua
Copyright ( C ) 2005-12  George Hazan

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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

#include "jabber.h"

int JabberHttpGatewayInit( HANDLE /*hConn*/, NETLIBOPENCONNECTION* /*nloc*/, NETLIBHTTPREQUEST* /*nlhr*/ )
{
#ifdef NNNN
	WORD wLen, wVersion, wType;
	WORD wIpLen;
	DWORD dwSid1, dwSid2, dwSid3, dwSid4;
	BYTE response[300], *buf;
	int responseBytes, recvResult;
	char szSid[33], szHttpServer[256], szHttpGetUrl[300], szHttpPostUrl[300];
	NETLIBHTTPPROXYINFO nlhpi = {0};

	for ( responseBytes = 0; ; ) {
		recvResult = Netlib_Recv( hConn, response + responseBytes, sizeof( response ) - responseBytes, MSG_DUMPPROXY );
		if ( recvResult<=0 ) break;
		responseBytes += recvResult;
		if ( responseBytes == sizeof( response ))
			break;
	}
	if ( responseBytes < 31 )
	{
		SetLastError( ERROR_INVALID_DATA );
		return 0;
	}
	buf = response;
	unpackWord( &buf, &wLen );
	unpackWord( &buf, &wVersion );	  /* always 0x0443 */
	unpackWord( &buf, &wType );
	buf += 6;  /* dunno */
	unpackDWord( &buf, &dwSid1 );
	unpackDWord( &buf, &dwSid2 );
	unpackDWord( &buf, &dwSid3 );
	unpackDWord( &buf, &dwSid4 );
	sprintf( szSid, "%08x%08x%08x%08x", dwSid1, dwSid2, dwSid3, dwSid4 );
	unpackWord( &buf, &wIpLen );
	if ( responseBytes < 30 + wIpLen || wIpLen == 0 || wIpLen > sizeof( szHttpServer ) - 1 )
	{
		SetLastError( ERROR_INVALID_DATA );
		return 0;
	}
	memcpy( szHttpServer, buf, wIpLen );
	szHttpServer[wIpLen] = '\0';

	nlhpi.cbSize = sizeof( nlhpi );
	nlhpi.flags = NLHPIF_USEPOSTSEQUENCE;
	nlhpi.szHttpGetUrl = szHttpGetUrl;
	nlhpi.szHttpPostUrl = szHttpPostUrl;
	nlhpi.firstPostSequence = 1;
	sprintf( szHttpGetUrl, "http://%s/monitor?sid=%s", szHttpServer, szSid );
	sprintf( szHttpPostUrl, "http://%s/data?sid=%s&seq=", szHttpServer, szSid );
	return CallService( MS_NETLIB_SETHTTPPROXYINFO, ( WPARAM )hConn, ( LPARAM )&nlhpi );
#endif
	return 1;
}

int JabberHttpGatewayBegin( HANDLE /*hConn*/, NETLIBOPENCONNECTION* /*nloc*/ )
{
	/*
	icq_packet packet;
	int serverNameLen;

	serverNameLen = strlen( nloc->szHost );

	packet.wLen = ( WORD )( serverNameLen + 4 );
	write_httphdr( &packet, HTTP_PACKETTYPE_LOGIN );
	packWord( &packet, ( WORD )serverNameLen );
	packString( &packet, nloc->szHost, ( WORD )serverNameLen );
	packWord( &packet, nloc->wPort );
	Netlib_Send( hConn, packet.pData, packet.wLen, MSG_DUMPPROXY|MSG_NOHTTPGATEWAYWRAP );
	mir_free( packet.pData );
	return 1;
	*/
	return 1;
}

int JabberHttpGatewayWrapSend( HANDLE hConn, PBYTE buf, int len, int flags, MIRANDASERVICE pfnNetlibSend )
{
	TCHAR* strb = mir_utf8decodeW(( char* )buf );

	TCHAR sid[25] = _T("");
	unsigned __int64 rid = 0;

	XmlNode hPayLoad( strb ); 
	XmlNode body( _T("body"));
	HXML hBody = body << XATTRI64( _T("rid"), rid++ ) << XATTR( _T("sid"), sid ) <<
		XATTR( _T("xmlns"), _T( "http://jabber.org/protocol/httpbind" ));
	xmlAddChild( hBody, hPayLoad );

	TCHAR* str = xi.toString( hBody, NULL );

	mir_free( strb );
	char* utfStr = mir_utf8encodeT( str );
	NETLIBBUFFER nlb = { utfStr, (int)strlen( utfStr ), flags };
	int result = pfnNetlibSend(( WPARAM )hConn, ( LPARAM )&nlb);
	mir_free( utfStr );
	xi.freeMem( str );

	return result;
}

#if 0
PBYTE JabberHttpGatewayUnwrapRecv( NETLIBHTTPREQUEST *nlhr, PBYTE buf, int len, int *outBufLen, void *( *NetlibRealloc )( void *, size_t ))
{
	WORD wLen, wType;
	PBYTE tbuf;
	int i, copyBytes;

	tbuf = buf;
	for ( i = 0;; )
	{
		if ( tbuf - buf + 2 > len ) break;
		unpackWord( &tbuf, &wLen );
		if ( wLen < 12 ) break;
		if ( tbuf - buf + wLen > len ) break;
		tbuf += 2;	  /* version */
		unpackWord( &tbuf, &wType );
		tbuf += 8;   /* flags & subtype */
		if ( wType == HTTP_PACKETTYPE_FLAP )
		{
			copyBytes = wLen - 12;
			if ( copyBytes > len - i )
			{
				/* invalid data - do our best to get something out of it */
				copyBytes = len - i;
			}
			memcpy( buf + i, tbuf, copyBytes );
			i += copyBytes;
		}
		tbuf += wLen - 12;
	}
	*outBufLen = i;
	return buf;
}
#endif