// *****************************************************
// UPnP.cpp - Integration of UPnP useful functionalities
// v1.0: 07/08
// Integrated in Scol Voyager v5.1a1
// *****************************************************

// Note: This package is loaded in src/win/hardload.c in SCinitsyspack()

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "../include/vscol.h"
#ifdef VERSION_WIN
#include <winsock.h>
#include <windows.h>
#endif
#include "../include/kernel.h"
#include "../scolobj.h"
#include "UPnP.h"


// Events management
int WSA_UPNP;
// UPnP object type
int OBJTYPUPNP;

// UPnP callbacks definition
#define RFLUPNP_NB 0
// Example: #define RFLUPNP_CB0 0, etc...



// Functions *******************************************************************


// UPnP Object management ******************************************************

int SCOLUPnPEvent(mmachine mscol, int data, int UPnPEvent, int UPnPError)
{
	return 0;
}


#ifdef VERSION_WIN
int ScolUPnP(mmachine m, HWND hwnd, unsigned msg, UINT wParam, LONG lParam, int *ret)
{
    int data;
    int UPnPEvent, UPnPError;
    
    data = (int)wParam;
    UPnPEvent = WSAGETSELECTEVENT(lParam);
    UPnPError = WSAGETSELECTERROR(lParam);
    return SCOLUPnPEvent(m, data, UPnPEvent, UPnPError);
}
#endif


int DESTROY_UPNP(mmachine m, int handsys, int objm)
{
  MMstore(m, objm>>1, 0, 0); 
  return 0;
}


// UPnP Scol functionalities ***************************************************

int UPNP_DetectRouter(mmachine m)
{
	if (MMpush(m,1<<1)) return MERRMEM;
	return 0;
}


// Package *********************************************************************

#define N_UPNP_PKG 2


char* upnp_name[N_UPNP_PKG] =
{
	"UPNP",
	"_UPNP_DetectRouter"
};


int (*upnp_fun[N_UPNP_PKG])(mmachine m) =
{
	NULL,
	UPNP_DetectRouter
};


int upnp_arg[N_UPNP_PKG] =
{
	TYPTYPE,
	0
};


char * upnp_type[N_UPNP_PKG] =
{
	NULL,
	"fun [] I"
};


int IniUPNP(mmachine m)
{
  OBJTYPUPNP = OBJregister(RFLUPNP_NB, 0, DESTROY_UPNP, "OBJTYPUPNP");
#ifdef VERSION_WIN
  WSA_UPNP = OBJgetUserEvent();
  OBJdefEvent(WSA_UPNP, ScolUPnP);
#endif
  return PKhardpak(m, "UPNP.pkg", N_UPNP_PKG, upnp_name, upnp_fun, upnp_arg, upnp_type);
}