/*
 * DPLAYX.DLL LibMain
 *
 * Copyright 1999,2000 - Peter Hunnisett
 *
 *
 * This library 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 2.1 of the License, or (at your option) any later version.
 *
 * This library 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 Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 * NOTES
 *  o DPMSGCMD_ENUMSESSIONSREPLY & DPMSGCMD_ENUMSESSIONSREQUEST
 *    Have most fields understood, but not all.  Everything seems to work.
 *  o DPMSGCMD_REQUESTNEWPLAYERID & DPMSGCMD_NEWPLAYERIDREPLY
 *    Barely work. This needs to be completed for sessions to start.
 *  o A small issue will be the fact that DirectX 6.1(ie. DirectPlay4)
 *    introduces a layer of functionality inside the DP objects which 
 *    provide guaranteed protocol delivery.  This is even if the native
 *    protocol, IPX or modem for instance, doesn't guarantee it. I'm going
 *    to leave this kind of implementation to as close to the end as 
 *    possible. However, I will implement an abstraction layer, where 
 *    possible, for this functionality. It will do nothing to start, but 
 *    will require only the implementation of the guaranteness to give 
 *    final implementation.
 *
 * TODO:
 *  - Implement mutual exclusion on object data for existing functions
 *  - Ensure that all dll stubs are present and the ordinals are correct
 *  - Addition of DirectX 7.0 functionality for direct play
 *  - Implement some WineLib test programs using sdk programs as a skeleton
 *  - Change RegEnumKeyEx enumeration pattern to allow error handling and to
 *    share registry implementation (or at least simplify).
 *  - Add in appropriate RegCloseKey calls for all the opening we're doing...
 *  - Fix all the buffer sizes for registry calls. They're off by one - 
 *    but in a safe direction.
 *  - Fix race condition on interface destruction
 *  - Handles need to be correctly reference counted
 *  - Check if we need to deallocate any list objects when destroying 
 *    a dplay interface
 *  - RunApplication process spawning needs to have correct syncronization.
 *  - Need to get inter lobby messages working.
 *  - Decypher dplay messages between applications and implement...
 *  - Need to implement lobby session spawning.
 *  - Improve footprint and realtime blocking by setting up a separate data share
 *    between lobby application and client since there can be multiple apps per
 *    client. Also get rid of offset dependency by making data offset independent
 *    somehow.
 */
#include <stdarg.h>

#include "winerror.h"
#include "windef.h"
#include "winbase.h"
#include "wine/debug.h"
#include "dplayx_global.h"

WINE_DEFAULT_DEBUG_CHANNEL(dplay);

/* This is a globally exported variable at ordinal 6 of DPLAYX.DLL */
DWORD gdwDPlaySPRefCount = 0; /* FIXME: Should it be initialized here? */


BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{

  TRACE( "(%p,%d,%p)\n", hinstDLL, fdwReason, lpvReserved );

  switch ( fdwReason )
  {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        /* First instance perform construction of global processor data */
        return DPLAYX_ConstructData();

    case DLL_PROCESS_DETACH:
        /* Last instance performs destruction of global processor data */
        return DPLAYX_DestructData();

    default:
      break;

  }

  return TRUE;
}

/***********************************************************************
 *              DllCanUnloadNow (DPLAYX.@)
 */
HRESULT WINAPI DllCanUnloadNow(void)
{
  HRESULT hr = ( gdwDPlaySPRefCount > 0 ) ? S_FALSE : S_OK;

  /* FIXME: Should I be putting a check in for class factory objects
   *        as well
   */

  TRACE( ": returning 0x%08x\n", hr );

  return hr;
}
