/*
 * 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 works. 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 guarantee 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;
}
