gecko-dev/cmd/winfe/apiapi.h

192 строки
4.1 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// APIAPI.H This header file containes the main api repository
// interface. Use the APIAPI to register interfaces and retrieve
// registered interfaces.
#ifndef __APIAPI_H
#define __APIAPI_H
#ifdef _WIN32
#include "objbase.h"
#else
#include <memory.h>
#include "compobj.h"
#endif
#include "assert.h"
#define APIID(id,x) DEFINE_GUID(id,0x30611040 + x,0x8c7a,0x11cf,0xac,0x4c,0x44,0x45,0x53,0x54,0x00,0x00);
APIID(IID_IApiapi,0); // base id
typedef enum {
ApiPrivate = 0x0,
ApiPublic
} APIEXPORT;
typedef int (*APIBOOTER)(char *);
typedef char * APICLASS;
typedef void * APISIGNATURE;
#define APISIGCMP(a,b) ((a)==(b))
#define APICLASS_APIAPI "APIAPI"
class IApiapi {
public:
virtual LPUNKNOWN GetFirstInstance (
APICLASS lpszClassName
) = 0;
virtual LPUNKNOWN GetNextInstance (
APICLASS lpszClassName,
LPUNKNOWN pUnk
) = 0;
virtual void * GetFirstApiInstance (
REFIID refiid,
LPUNKNOWN * ppUnk
) = 0;
virtual int RemoveInstance(
LPUNKNOWN pUnk
) = 0;
virtual LPUNKNOWN CreateClassInstance (
APICLASS lpszClassName,
LPUNKNOWN pUnkOuter = NULL,
APISIGNATURE apiSig = 0
) = 0;
virtual int RegisterClassFactory (
APICLASS lpszClassName,
LPCLASSFACTORY pUnknown,
char * szModuleName = 0
) = 0;
};
typedef IApiapi * LPAPIAPI;
#ifdef WIN32
#ifdef __BORLANDC__
#define API_PUBLIC(__x) __x
#else
#define API_PUBLIC(__x) _declspec(dllexport) __x
#endif
#else
#define API_PUBLIC(__x) __x _cdecl _export _loadds
#endif
extern "C" {
API_PUBLIC(LPAPIAPI) GetAPIAPI(void);
}
class ApiApi {
public:
IApiapi * m_Apiapi;
ApiApi ( )
{
m_Apiapi = GetAPIAPI();
assert(m_Apiapi);
}
IApiapi * operator -> ( )
{
return m_Apiapi;
}
};
class ApiPtr {
protected:
LPUNKNOWN m_pUnknown;
void * m_pSomeInterface;
public:
ApiPtr ( REFIID apiid, LPUNKNOWN pUnknown = 0 )
{
if (!pUnknown) {
LPAPIAPI pApiapi = GetAPIAPI();
assert(pApiapi);
m_pSomeInterface = pApiapi->GetFirstApiInstance(apiid,&m_pUnknown);
m_pUnknown = NULL;
}
else {
m_pUnknown = pUnknown;
assert(pUnknown->QueryInterface(apiid,(LPVOID*)&m_pSomeInterface)==NOERROR);
}
}
~ApiPtr ( )
{
if (m_pUnknown)
m_pUnknown->Release();
}
void * GetAPI ( )
{
return m_pSomeInterface;
}
};
#define APIPTRDEF(apiid,i,v,unk) ApiPtr v##_ptr(apiid,unk); \
i * v = (i *)v##_ptr.GetAPI();
#define ApiApiPtr(v) LPAPIAPI v = GetAPIAPI()
#define DECLARE_FACTORY(f) static f __##f
// Generic Classes
class CGenericObject : public IUnknown
{
protected:
ULONG m_ulRefCount;
public:
CGenericObject ( ) {
m_ulRefCount = 0;
}
virtual ~CGenericObject() {}
// IUnknown Interface
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
class CGenericFactory : public IClassFactory
{
protected:
ULONG m_ulRefCount;
public:
CGenericFactory ( ) {
m_ulRefCount = 0;
}
// IUnknown Interface
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IClassFactory Interface
STDMETHODIMP CreateInstance(LPUNKNOWN,REFIID,LPVOID*);
STDMETHODIMP LockServer(BOOL);
};
#endif