diff --git a/config/config.mk b/config/config.mk index 99a009aaf0c..b6e965ad0a0 100644 --- a/config/config.mk +++ b/config/config.mk @@ -471,6 +471,11 @@ ifdef MOZ_PROFILE_USE DSO_PIC_CFLAGS += $(PROFILE_USE_CFLAGS) endif +# Does the makefile specifies the internal XPCOM API linkage? +ifneq (,$(MOZILLA_INTERNAL_API)$(LIBXUL_LIBRARY)) +DEFINES += -DMOZILLA_INTERNAL_API +endif + # Force XPCOM/widget/gfx methods to be _declspec(dllexport) when we're # building libxul libraries ifdef MOZ_ENABLE_LIBXUL @@ -534,6 +539,10 @@ REQ_INCLUDES = $(foreach d,$(REQUIRES),-I$(DIST)/include/$d) INCLUDES = $(LOCAL_INCLUDES) $(REQ_INCLUDES) -I$(PUBLIC) -I$(DIST)/include $(OS_INCLUDES) +ifndef MOZILLA_INTERNAL_API +INCLUDES += -I$(DIST)/sdk/include +endif + CFLAGS = $(OS_CFLAGS) CXXFLAGS = $(OS_CXXFLAGS) LDFLAGS = $(OS_LDFLAGS) diff --git a/modules/libpref/src/nsPrefService.cpp b/modules/libpref/src/nsPrefService.cpp index 39a86a344c2..c564166e563 100644 --- a/modules/libpref/src/nsPrefService.cpp +++ b/modules/libpref/src/nsPrefService.cpp @@ -49,6 +49,7 @@ #include "nsXPIDLString.h" #include "nsCRT.h" #include "nsCOMArray.h" +#include "nsXPCOMCID.h" #include "nsQuickSort.h" #include "prmem.h" @@ -756,8 +757,7 @@ static nsresult pref_InitInitialObjects() // xxxbsmedberg: TODO load default prefs from a category // but the architecture is not quite there yet - static NS_DEFINE_CID(kDirectoryServiceCID, NS_DIRECTORY_SERVICE_CID); - nsCOMPtr dirSvc(do_GetService(kDirectoryServiceCID, &rv)); + nsCOMPtr dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return rv; nsCOMPtr dirList; diff --git a/profile/dirserviceprovider/public/nsProfileDirServiceProvider.h b/profile/dirserviceprovider/public/nsProfileDirServiceProvider.h index 0b875bf380c..4a894449fdb 100755 --- a/profile/dirserviceprovider/public/nsProfileDirServiceProvider.h +++ b/profile/dirserviceprovider/public/nsProfileDirServiceProvider.h @@ -40,11 +40,15 @@ #include "nsIDirectoryService.h" #include "nsILocalFile.h" -#ifdef STANDALONE_PROFILEDIRSERVICE -#define MOZILLA_STRICT_API -#include "nsEmbedString.h" -#else +#include "nsCOMPtr.h" +#include "nsDirectoryServiceUtils.h" +#include "nsComponentManagerUtils.h" +#include "nsServiceManagerUtils.h" + +#ifdef MOZILLA_INTERNAL_API #include "nsString.h" +#else +#include "nsEmbedString.h" #endif // Forward Declarations @@ -112,7 +116,7 @@ protected: PRPackedBool mNotifyObservers; PRPackedBool mSharingEnabled; -#ifdef STANDALONE_PROFILEDIRSERVICE +#ifndef MOZILLA_INTERNAL_API nsEmbedString mNonSharedDirName; #else nsString mNonSharedDirName; diff --git a/profile/dirserviceprovider/src/Makefile.in b/profile/dirserviceprovider/src/Makefile.in index e5c2b32ac40..804eb06a321 100755 --- a/profile/dirserviceprovider/src/Makefile.in +++ b/profile/dirserviceprovider/src/Makefile.in @@ -49,7 +49,7 @@ MOZILLA_INTERNAL_API = 1 REQUIRES = xpcom \ string \ $(NULL) - + ifdef MOZ_PROFILESHARING REQUIRES += ipcd \ profilesharingsetup \ diff --git a/profile/dirserviceprovider/src/nsProfileStringTypes.h b/profile/dirserviceprovider/src/nsProfileStringTypes.h index f951b81fa63..337d642ec30 100644 --- a/profile/dirserviceprovider/src/nsProfileStringTypes.h +++ b/profile/dirserviceprovider/src/nsProfileStringTypes.h @@ -49,9 +49,8 @@ * embed strings APIs. */ -#ifdef STANDALONE_PROFILEDIRSERVICE +#ifndef MOZILLA_INTERNAL_API -#define MOZILLA_STRICT_API #include "nsStringAPI.h" typedef nsCString nsPromiseFlatCString; diff --git a/profile/dirserviceprovider/standalone/Makefile.in b/profile/dirserviceprovider/standalone/Makefile.in index 3c7a25929e3..cc47cc76f03 100644 --- a/profile/dirserviceprovider/standalone/Makefile.in +++ b/profile/dirserviceprovider/standalone/Makefile.in @@ -53,7 +53,7 @@ REQUIRES += ipcd \ profilesharingsetup \ $(NULL) endif - + CPPSRCS = $(MODULES_PROFILEDIRSERVICE_SRC_LCSRCS) # we don't want the shared lib @@ -61,8 +61,6 @@ FORCE_STATIC_LIB = 1 include $(topsrcdir)/config/rules.mk -DEFINES += -DSTANDALONE_PROFILEDIRSERVICE - LOCAL_INCLUDES = -I$(srcdir)/../src export:: $(MODULES_PROFILEDIRSERVICE_SRC_CSRCS) diff --git a/xpcom/base/nsIWeakReference.idl b/xpcom/base/nsIWeakReference.idl index 2806fc8af7d..3bdf6eb8505 100644 --- a/xpcom/base/nsIWeakReference.idl +++ b/xpcom/base/nsIWeakReference.idl @@ -95,8 +95,8 @@ interface nsISupportsWeakReference : nsISupports %{C++ -#ifndef MOZILLA_STRICT_API -#include "nsIWeakReferenceUtils.h" +#ifdef MOZILLA_INTERNAL_API +#include "nsIWeakReferenceUtils.h" #endif %} diff --git a/xpcom/base/nscore.h b/xpcom/base/nscore.h index c823fce3f28..7952f4cafaf 100644 --- a/xpcom/base/nscore.h +++ b/xpcom/base/nscore.h @@ -253,10 +253,10 @@ #define NS_COM NS_IMPORT #endif -#ifdef MOZILLA_STRICT_API -#define NS_COM_GLUE -#else +#ifdef MOZILLA_INTERNAL_API #define NS_COM_GLUE NS_COM +#else +#define NS_COM_GLUE #endif diff --git a/xpcom/build/nsXPCOM.h b/xpcom/build/nsXPCOM.h index 1a0656563cf..1be4d8beeb6 100644 --- a/xpcom/build/nsXPCOM.h +++ b/xpcom/build/nsXPCOM.h @@ -39,7 +39,7 @@ #define nsXPCOM_h__ // Map frozen functions to private symbol names if not using strict API. -#ifndef MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API # define NS_InitXPCOM2 NS_InitXPCOM2_P # define NS_ShutdownXPCOM NS_ShutdownXPCOM_P # define NS_GetServiceManager NS_GetServiceManager_P diff --git a/xpcom/build/nsXPCOMPrivate.h b/xpcom/build/nsXPCOMPrivate.h index 08a4f204629..57799019f9a 100644 --- a/xpcom/build/nsXPCOMPrivate.h +++ b/xpcom/build/nsXPCOMPrivate.h @@ -40,7 +40,7 @@ #define nsXPComPrivate_h__ // Map frozen functions to private symbol names if not using strict API. -#ifndef MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API # define NS_RegisterXPCOMExitRoutine NS_RegisterXPCOMExitRoutine_P # define NS_UnregisterXPCOMExitRoutine NS_UnregisterXPCOMExitRoutine_P #endif diff --git a/xpcom/components/nsIComponentManager.idl b/xpcom/components/nsIComponentManager.idl index c65a3718739..d6278489f75 100644 --- a/xpcom/components/nsIComponentManager.idl +++ b/xpcom/components/nsIComponentManager.idl @@ -104,7 +104,7 @@ interface nsIComponentManager : nsISupports %{ C++ -#ifndef MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API #include "nsComponentManagerUtils.h" #endif %} C++ diff --git a/xpcom/components/nsIServiceManager.idl b/xpcom/components/nsIServiceManager.idl index 3574b2a74d6..302c26c385f 100644 --- a/xpcom/components/nsIServiceManager.idl +++ b/xpcom/components/nsIServiceManager.idl @@ -110,7 +110,7 @@ interface nsIServiceManager : nsISupports // Observing xpcom autoregistration. Topics will be 'start' and 'stop'. #define NS_XPCOM_AUTOREGISTRATION_OBSERVER_ID "xpcom-autoregistration" -#ifndef MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API #include "nsXPCOM.h" #include "nsServiceManagerUtils.h" #include "nsIServiceManagerObsolete.h" diff --git a/xpcom/glue/Makefile.in b/xpcom/glue/Makefile.in index 272e6bc76a7..94d444f2087 100644 --- a/xpcom/glue/Makefile.in +++ b/xpcom/glue/Makefile.in @@ -84,5 +84,3 @@ include $(topsrcdir)/config/rules.mk # hack to work around objdir bustage export:: rm -f $(XPCOM_GLUE_SRC_CSRCS:.cpp=.$(OBJ_SUFFIX)) - -DEFINES += -DMOZILLA_STRICT_API diff --git a/xpcom/glue/nsComponentManagerUtils.cpp b/xpcom/glue/nsComponentManagerUtils.cpp index d3e82434581..9ed06a3f962 100644 --- a/xpcom/glue/nsComponentManagerUtils.cpp +++ b/xpcom/glue/nsComponentManagerUtils.cpp @@ -46,7 +46,9 @@ #include "nsComponentManagerUtils.h" #include "nsServiceManagerUtils.h" -#ifdef MOZILLA_STRICT_API +#include "nsIComponentManager.h" + +#ifndef MOZILLA_INTERNAL_API nsresult CallGetService(const nsCID &aCID, const nsIID &aIID, void **aResult) @@ -94,7 +96,7 @@ CallGetService(const char *aContractID, const nsIID &aIID, void **aResult) #endif -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API nsresult CallCreateInstance(const nsCID &aCID, nsISupports *aDelegate, diff --git a/xpcom/glue/nsServiceManagerUtils.h b/xpcom/glue/nsServiceManagerUtils.h index 0a61f611730..a08fd201d4a 100644 --- a/xpcom/glue/nsServiceManagerUtils.h +++ b/xpcom/glue/nsServiceManagerUtils.h @@ -39,7 +39,6 @@ #define nsServiceManagerUtils_h__ #include "nsIServiceManager.h" -#include "nsIServiceManagerObsolete.h" #include "nsCOMPtr.h" inline diff --git a/xpcom/glue/standalone/Makefile.in b/xpcom/glue/standalone/Makefile.in index 11d9fa39216..3acb6c89249 100644 --- a/xpcom/glue/standalone/Makefile.in +++ b/xpcom/glue/standalone/Makefile.in @@ -82,4 +82,4 @@ include $(topsrcdir)/config/rules.mk export:: $(XPCOM_GLUE_SRC_CSRCS) $(INSTALL) $^ . -DEFINES += -DXPCOM_GLUE -DMOZILLA_STRICT_API +DEFINES += -DXPCOM_GLUE diff --git a/xpcom/io/Makefile.in b/xpcom/io/Makefile.in index c63f75f0e28..b7c9456f680 100644 --- a/xpcom/io/Makefile.in +++ b/xpcom/io/Makefile.in @@ -94,7 +94,6 @@ endif # OS2 EXPORTS = \ nsAppDirectoryServiceDefs.h \ nsDirectoryService.h \ - nsDirectoryServiceUtils.h \ nsEscape.h \ nsFastLoadPtr.h \ nsFastLoadService.h \ @@ -160,6 +159,7 @@ SDK_XPIDLSRCS = \ SDK_HEADERS = \ nsDirectoryServiceDefs.h \ + nsDirectoryServiceUtils.h \ $(NULL) EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS)) diff --git a/xpcom/io/nsDirectoryService.h b/xpcom/io/nsDirectoryService.h index 5150e837c8f..303b245c419 100644 --- a/xpcom/io/nsDirectoryService.h +++ b/xpcom/io/nsDirectoryService.h @@ -47,6 +47,7 @@ #define NS_XPCOM_INIT_CURRENT_PROCESS_DIR "MozBinD" // Can be used to set NS_XPCOM_CURRENT_PROCESS_DIR // CANNOT be used to GET a location +#define NS_DIRECTORY_SERVICE_CID {0xf00152d0,0xb40b,0x11d3,{0x8c, 0x9c, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74}} class nsDirectoryService : public nsIDirectoryService, public nsIProperties, @@ -54,8 +55,6 @@ class nsDirectoryService : public nsIDirectoryService, { public: - NS_DEFINE_STATIC_CID_ACCESSOR(NS_DIRECTORY_SERVICE_CID); - // nsISupports interface NS_DECL_ISUPPORTS diff --git a/xpcom/io/nsDirectoryServiceUtils.h b/xpcom/io/nsDirectoryServiceUtils.h index f2482c76c75..1fa66cd41cc 100644 --- a/xpcom/io/nsDirectoryServiceUtils.h +++ b/xpcom/io/nsDirectoryServiceUtils.h @@ -41,16 +41,15 @@ #include "nsIServiceManager.h" #include "nsIProperties.h" +#include "nsServiceManagerUtils.h" #include "nsCOMPtr.h" - -#define NS_DIRECTORY_SERVICE_CID {0xf00152d0,0xb40b,0x11d3,{0x8c, 0x9c, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74}} +#include "nsXPCOMCID.h" inline nsresult NS_GetSpecialDirectory(const char* specialDirName, nsIFile* *result) { nsresult rv; - static NS_DEFINE_CID(kDirectoryServiceCID, NS_DIRECTORY_SERVICE_CID); - nsCOMPtr serv(do_GetService(kDirectoryServiceCID, &rv)); + nsCOMPtr serv(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); if (NS_FAILED(rv)) return rv; diff --git a/xpcom/io/nsIFile.idl b/xpcom/io/nsIFile.idl index 1d70858e2e8..7057253bf28 100644 --- a/xpcom/io/nsIFile.idl +++ b/xpcom/io/nsIFile.idl @@ -337,7 +337,7 @@ interface nsIFile : nsISupports }; %{C++ -#ifndef MOZILLA_STRICT_API -#include "nsDirectoryServiceUtils.h" +#ifdef MOZILLA_INTERNAL_API +#include "nsDirectoryServiceUtils.h" #endif %} diff --git a/xpcom/sample/Makefile.in b/xpcom/sample/Makefile.in index a0f77df9c2b..09ec9523ecf 100644 --- a/xpcom/sample/Makefile.in +++ b/xpcom/sample/Makefile.in @@ -42,46 +42,63 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk +# MODULE specifies where header files from this Makefile are installed, +# i.e. dist/include/xpcomsample MODULE = xpcomsample + +# XPIDL_MODULE names the .xpt file generated from IDL files +# i.e. dist/bin/components/xpcomsample.xpt XPIDL_MODULE = xpcomsample + +# LIBRARY_NAME names the library generated by this makefile, +# i.e. dist/bin/components/libxpcomsample.so LIBRARY_NAME = xpcomsample + +# On MS Windows and OS/2, SHORT_LIBNAME is used to generate a library +# with an 8.3 filename, e.g. dist/bin/components/xpcomsmp.dll SHORT_LIBNAME = xpcomsmp +# IS_COMPONENT indicates that this makefile builds a component shared library. IS_COMPONENT = 1 + +# If this is Makefile builds a component, MODULE_NAME must match the module +# name specified in NS_IMPL_NSGETMODULE MODULE_NAME = nsSampleModule # Ensure that the xpcom classes that we build # do not export themselves -DEFINES += -DMOZILLA_STRICT_API -DXPCOM_GLUE - - -REQUIRES = string \ - xpcom \ - $(NULL) +DEFINES += -DXPCOM_GLUE +# CPPSRCS specifies C++ files to be built into a library. CPPSRCS = \ nsSample.cpp \ nsSampleModule.cpp \ $(NULL) +# XPIDLSRCS specified IDL files. The build system runs the xpidl tool on these +# files to generate C++ headers and .xpt typelib files. XPIDLSRCS = nsISample.idl TESTCPPSRCS = nsTestSample.cpp -CPPSRCS += $(TESTCPPSRCS) - +# SIMPLE_PROGRAMS builds an executable program from a single source file. SIMPLE_PROGRAMS = $(TESTCPPSRCS:.cpp=$(BIN_SUFFIX)) include $(topsrcdir)/config/config.mk +# EXTRA_COMPONENTS installs components written JavaScript to +# dist/bin/components EXTRA_COMPONENTS = nsSample.js -# separate libraries linked in. +# EXTRA_DSO_LDOPTS specifies linker flags when building a shared library +# from this Makefile EXTRA_DSO_LDOPTS = \ $(DIST)/lib/$(LIB_PREFIX)xpcomglue.$(LIB_SUFFIX) \ $(NSPR_LIBS) \ $(NULL) +# LIBS specifies linker flags when building an executable program from +# this Makefile. LIBS = \ $(DIST)/lib/$(LIB_PREFIX)xpcomglue.$(LIB_SUFFIX) \ $(NSPR_LIBS) \ diff --git a/xpcom/string/public/nsStringAPI.h b/xpcom/string/public/nsStringAPI.h index 614541ca6f5..6d3568efbe1 100644 --- a/xpcom/string/public/nsStringAPI.h +++ b/xpcom/string/public/nsStringAPI.h @@ -47,7 +47,7 @@ */ // Map frozen functions to private symbol names if not using strict API. -#ifndef MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API # define NS_StringContainerInit NS_StringContainerInit_P # define NS_StringContainerInit2 NS_StringContainerInit2_P # define NS_StringContainerFinish NS_StringContainerFinish_P @@ -753,14 +753,14 @@ NS_UTF16ToCString(const nsAString &aSource, nsCStringEncoding aDestEncoding, * internal definition of these classes from nsAString.h in the Mozilla tree. */ -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API #define nsAString_external nsAString #define nsACString_external nsACString #endif class nsAString_external { -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API public: typedef PRUnichar char_type; @@ -839,7 +839,7 @@ public: NS_HIDDEN_(void) Cut( index_type cutStart, size_type cutLength ) { Replace(cutStart, cutLength, nsnull, 0); } -#endif // MOZILLA_STRICT_API +#endif // MOZILLA_INTERNAL_API private: void *v; @@ -847,7 +847,7 @@ private: class nsACString_external { -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API public: typedef char char_type; @@ -926,7 +926,7 @@ public: NS_HIDDEN_(void) Cut( index_type cutStart, size_type cutLength ) { Replace(cutStart, cutLength, nsnull, 0); } -#endif // MOZILLA_STRICT_API +#endif // MOZILLA_INTERNAL_API private: void *v; @@ -970,7 +970,7 @@ public: * string API easier to use. */ -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API #include "nsDebug.h" /** @@ -1602,6 +1602,6 @@ StringTail( const nsACString& str, PRUint32 count ) #define EmptyCString() nsCString() #define EmptyString() nsString() -#endif // MOZILLA_STRICT_API +#endif // MOZILLA_INTERNAL_API #endif // nsStringAPI_h__ diff --git a/xpcom/string/public/nsTAString.h b/xpcom/string/public/nsTAString.h index e788e98b60b..5648840ea06 100644 --- a/xpcom/string/public/nsTAString.h +++ b/xpcom/string/public/nsTAString.h @@ -37,6 +37,9 @@ * * ***** END LICENSE BLOCK ***** */ +#ifndef MOZILLA_INTERNAL_API +#error Cannot use internal string classes without MOZILLA_INTERNAL_API defined. Use the frozen header nsStringAPI.h instead. +#endif /** * The base for string comparators diff --git a/xpcom/tests/TestMinStringAPI.cpp b/xpcom/tests/TestMinStringAPI.cpp index 2cc445a24e5..d0b6145542c 100644 --- a/xpcom/tests/TestMinStringAPI.cpp +++ b/xpcom/tests/TestMinStringAPI.cpp @@ -35,7 +35,9 @@ * * ***** END LICENSE BLOCK ***** */ -#define MOZILLA_STRICT_API +#ifdef MOZILLA_INTERNAL_API +#undef MOZILLA_INTERNAL_API +#endif #include #include "nsStringAPI.h" diff --git a/xpcom/tools/registry/Makefile.in b/xpcom/tools/registry/Makefile.in index 251355e933e..2404431feac 100644 --- a/xpcom/tools/registry/Makefile.in +++ b/xpcom/tools/registry/Makefile.in @@ -45,11 +45,7 @@ include $(DEPTH)/config/autoconf.mk MODULE = xpcom CPPSRCS = regxpcom.cpp -DEFINES += -DXPCOM_GLUE -DMOZILLA_STRICT_API - -REQUIRES = \ - string \ - $(NULL) +DEFINES += -DXPCOM_GLUE LOCAL_INCLUDES = \ -I$(srcdir)/../../build \ diff --git a/xpfe/bootstrap/Makefile.in b/xpfe/bootstrap/Makefile.in index 71020b4ca9d..36eeaeb140e 100644 --- a/xpfe/bootstrap/Makefile.in +++ b/xpfe/bootstrap/Makefile.in @@ -65,7 +65,7 @@ endif endif ifdef GRE_BUILD -DEFINES += -DXPCOM_GLUE -DMOZILLA_STRICT_API +DEFINES += -DXPCOM_GLUE else MOZILLA_INTERNAL_API = 1 endif diff --git a/xpfe/bootstrap/nsAppRunner.cpp b/xpfe/bootstrap/nsAppRunner.cpp index 913fbdc4f7e..752f7f5c247 100644 --- a/xpfe/bootstrap/nsAppRunner.cpp +++ b/xpfe/bootstrap/nsAppRunner.cpp @@ -826,7 +826,7 @@ static char kMatchOSLocalePref[] = "intl.locale.matchOS"; nsresult getCountry(const nsAString& lc_name, nsAString& aCountry) { -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API const PRUnichar *begin = lc_name.BeginReading(); const PRUnichar *end = lc_name.EndReading(); while (begin != end) { diff --git a/xpfe/bootstrap/nsStringSupport.h b/xpfe/bootstrap/nsStringSupport.h index e6e77b77481..dbbc903524f 100644 --- a/xpfe/bootstrap/nsStringSupport.h +++ b/xpfe/bootstrap/nsStringSupport.h @@ -37,7 +37,7 @@ #ifndef nsStringSupport_h__ #define nsStringSupport_h__ -#ifdef MOZILLA_STRICT_API +#ifndef MOZILLA_INTERNAL_API #include "nsStringAPI.h" #include "nsMemory.h" @@ -106,7 +106,7 @@ typedef nsString nsAutoString; typedef nsCString nsXPIDLCString; typedef nsString nsXPIDLString; -#else // MOZILLA_STRICT_API +#else // MOZILLA_INTERNAL_API #include "nsString.h" #include "nsNativeCharsetUtils.h" @@ -136,6 +136,6 @@ FindInString(nsCString &str, const char *needle, PRBool ignoreCase = PR_FALSE) return str.Find(needle, ignoreCase); } -#endif // MOZILLA_STRICT_API +#endif // MOZILLA_INTERNAL_API #endif // !nsStringSupport_h__