/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "windows.h"

#include "npfunctions.h"
#include "npapi.h"
#include "plugin.h"
#include "dbg.h"

nsPluginThread * thePluginThread = NULL;

NPError NPP_New(NPMIMEType aType,
                NPP aInstance,
                uint16 aMode,
                int16 aArgc,
                char* aArgn[],
                char* aArgv[],
                NPSavedData* aSaved)
{   
  dbgOut1("wrapper: NPP_New");

  NPError rv = NPERR_NO_ERROR;

  // lamely assuming there is only one embed tag on the page!
  
  // if it is first time in, we don't have it yet
  // initiate a thread with plugin running in it
  thePluginThread = new nsPluginThread((DWORD)aType);

  if (!thePluginThread)
    return NPERR_GENERIC_ERROR;

  rv = (NPError)thePluginThread->callNPP(action_npp_new, 
                                         (DWORD)aType, 
                                         (DWORD)aInstance, 
                                         (DWORD)aMode, 
                                         (DWORD)aArgc, 
                                         (DWORD)aArgn, 
                                         (DWORD)aArgv, 
                                         (DWORD)aSaved);

  return rv;
}

NPError NPP_Destroy (NPP aInstance, NPSavedData** aSave)
{
  dbgOut1("wrapper: NPP_Destroy");

  if (!thePluginThread)
    return NPERR_GENERIC_ERROR;

  NPError ret = (NPError)thePluginThread->callNPP(action_npp_destroy, (DWORD)aInstance, (DWORD)aSave);

  delete thePluginThread;
  thePluginThread = NULL;

  return ret;
}

NPError NPP_SetWindow (NPP aInstance, NPWindow* aNPWindow)
{    
  dbgOut1("wrapper: NPP_SetWindow");

  NPError rv = (NPError)thePluginThread->callNPP(action_npp_set_window, (DWORD)aInstance, (DWORD)aNPWindow);
  return rv;
}

NPError NPP_NewStream(NPP aInstance,
                      NPMIMEType aType,
                      NPStream* aStream, 
                      NPBool aSeekable,
                      uint16* aStype)
{
  dbgOut1("wrapper: NPP_NewStream");

  NPError rv = (NPError)thePluginThread->callNPP(action_npp_new_stream, (DWORD)aInstance, (DWORD)aType, (DWORD)aStream, (DWORD)aSeekable, (DWORD)aStype);
  return rv;
}

int32 NPP_WriteReady (NPP aInstance, NPStream *aStream)
{
  dbgOut1("wrapper: NPP_WriteReady");

  int32 rv = (int32)thePluginThread->callNPP(action_npp_write_ready, (DWORD)aInstance, (DWORD)aStream);
  return rv;
}

int32 NPP_Write (NPP aInstance, NPStream *aStream, int32 aOffset, int32 len, void *aBuffer)
{   
  dbgOut1("wrapper: NPP_Write");

  int32 rv = (int32)thePluginThread->callNPP(action_npp_write, (DWORD)aInstance, (DWORD)aStream, (DWORD)aOffset, (DWORD)len, (DWORD)aBuffer);
  return rv;
}

NPError NPP_DestroyStream (NPP aInstance, NPStream *aStream, NPError aReason)
{
  dbgOut1("wrapper: NPP_DestroyStream");

  NPError rv = (NPError)thePluginThread->callNPP(action_npp_destroy_stream, (DWORD)aInstance, (DWORD)aStream, (DWORD)aReason);
  return rv;
}

void NPP_StreamAsFile (NPP aInstance, NPStream* aStream, const char* aName)
{
  dbgOut1("wrapper: NPP_StreamAsFile");

  thePluginThread->callNPP(action_npp_stream_as_file, (DWORD)aInstance, (DWORD)aStream, (DWORD)aName);
}

void NPP_Print (NPP aInstance, NPPrint* aPrintInfo)
{
  dbgOut1("wrapper: NPP_Print");

  thePluginThread->callNPP(action_npp_print, (DWORD)aInstance, (DWORD)aPrintInfo);
}

void NPP_URLNotify(NPP aInstance, const char* aUrl, NPReason aReason, void* aNotifyData)
{
  dbgOut1("wrapper: NPP_URLNotify");

  thePluginThread->callNPP(action_npp_url_notify, (DWORD)aInstance, (DWORD)aUrl, (DWORD)aReason, (DWORD)aNotifyData);
}

NPError	NPP_GetValue(NPP aInstance, NPPVariable aVariable, void *aValue)
{
  dbgOut1("wrapper: NPP_GetValue");

  NPError rv = (NPError)thePluginThread->callNPP(action_npp_get_value, (DWORD)aInstance, (DWORD)aVariable, (DWORD)aValue);
  return rv;
}

NPError NPP_SetValue(NPP aInstance, NPNVariable aVariable, void *aValue)
{
  dbgOut1("wrapper: NPP_SetValue");

  NPError rv = (NPError)thePluginThread->callNPP(action_npp_set_value, (DWORD)aInstance, (DWORD)aVariable, (DWORD)aValue);
  return rv;
}

int16	NPP_HandleEvent(NPP aInstance, void* aEvent)
{
  dbgOut1("wrapper: NPP_HandleEvent");

  int16 rv = (int16)thePluginThread->callNPP(action_npp_handle_event, (DWORD)aInstance, (DWORD)aEvent);
  return rv;
}
