#include <stdio.h>

#include <ne_alloc.h>
#include <ne_string.h>
#include <ne_md5.h>
#include <ne_socket.h>
#include <ne_private.h>

#define USE_GETADDRINFO

#ifdef WIN32
#include <winsock2.h>
#include <stddef.h>
#ifdef USE_GETADDRINFO
#include <ws2tcpip.h>
#endif
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

#include "solbox_util.h"

void md5_buffer(const char *buffer, char *digest) 
{
	unsigned char md5_buf[16];

	struct ne_md5_ctx *ctx;

	ctx = ne_md5_create_ctx();

	ne_md5_process_bytes(buffer, strlen(buffer), ctx);
	ne_md5_finish_ctx(ctx, md5_buf);

	ne_md5_to_ascii(md5_buf, digest);

	ne_md5_destroy_ctx(ctx);
// 0.26.0 버전 부터 바뀜
#ifdef __NEON_0_25_4__
	struct ne_md5_ctx ctx;

	ne_md5_init_ctx(&ctx);
	ne_md5_process_bytes(buffer, strlen(buffer), &ctx);
	ne_md5_finish_ctx(&ctx, md5_buf);

	ne_md5_to_ascii(md5_buf, digest);
#endif // __NEON_0_25_4__
}

void md5_buffer_bin(const char *buffer, char *digest)
{
   unsigned char md5_buf[16];

   struct ne_md5_ctx *ctx;

   ctx = ne_md5_create_ctx();

   ne_md5_process_bytes(buffer, strlen(buffer), ctx);
   ne_md5_finish_ctx(ctx, md5_buf);

   memcpy(digest,md5_buf,16);

   ne_md5_destroy_ctx(ctx);
   // 0.26.0 버전 부터 바뀜
#ifdef __NEON_0_25_4__
   struct ne_md5_ctx ctx;

   ne_md5_init_ctx(&ctx);

   ne_md5_process_bytes(buffer, strlen(buffer), &ctx);
   ne_md5_finish_ctx(&ctx, md5_buf);
   memcpy(digest,md5_buf,16);
#endif // __NEON_0_25_4__
}

// 버전UP(0.29.5) 따른 uri parse 대처
// 변경된 버전 경우 rc.solbox.com/dav 와 같은 형식으로 올경우 host(rc.solbox.com)를 파서 못함
// http://rc.solbox.com/dav 같은 형식으로 와야만이 host를 파싱할 수 있음
#define HTTP_SCHEME		"http://"
int solbox_uri_parse(const char *uri, ne_uri *parsed)
{
	// change uri : http:// 를 강제적으로 넣는다.
	char tmpuri[1024] = {0};

	if(ne_strncasecmp(uri, HTTP_SCHEME,strlen(HTTP_SCHEME)))	
		sprintf(tmpuri, "%s%s",HTTP_SCHEME, uri);
	else 
		sprintf(tmpuri, "%s", uri);

	return ne_uri_parse(tmpuri, parsed);
}

// ne_session 포함된 ne_socket 가져오는 함수
ne_socket* get_session_socket (ne_session*  pnsess) 
{
	return pnsess->socket;
}