From: Harley Laue Date: Thu, 13 May 2010 22:50:33 +0000 (-0500) Subject: Merged FMod changes in X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=0acdb5e7e90ddd677a5e72cc97731dad12edf230;hp=612415ff494c29cf2fc7ea560da9908eaff7d847;p=lugaru.git Merged FMod changes in --- diff --git a/.hgignore b/.hgignore index 0992e3e..795dbe1 100644 --- a/.hgignore +++ b/.hgignore @@ -8,3 +8,4 @@ build *~ .*.swp lugaru-* +cmake-build diff --git a/CMakeLists.txt b/CMakeLists.txt index 9be2c9e..360148b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,9 @@ project(lugaru) cmake_minimum_required(VERSION 2.6) +set(SRCDIR "${CMAKE_CURRENT_SOURCE_DIR}/Source") +set(DEPDIR "${CMAKE_CURRENT_SOURCE_DIR}/Dependencies") + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel" @@ -20,46 +23,398 @@ if(NOT LUGARU_INSTALL_PREFIX) endif(WIN32) endif(NOT LUGARU_INSTALL_PREFIX) -set(CMAKE_INSTALL_PREFIX "${LUGARU_INSTALL_PREFIX}" CACHE INTERNAL "Prefix -prepended to install directories" FORCE) +set(CMAKE_INSTALL_PREFIX "${LUGARU_INSTALL_PREFIX}" CACHE INTERNAL "Prefix prepended to install directories" FORCE) if(WIN32) set(OPENGL_gl_LIBRARY "-lopengl32" CACHE STRING "OpenGL library for Win32" FORCE) set(OPENGL_glu_LIBRARY "-lglu32" CACHE STRING "GLU library for Win32" FORCE) endif(WIN32) + + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -find_package(OpenAL REQUIRED) -find_package(PNG REQUIRED) -find_package(JPEG REQUIRED) -find_package(ZLIB REQUIRED) + +set(LUGARU_SRCS + ${SRCDIR}/Frustum.cpp + ${SRCDIR}/GameDraw.cpp + ${SRCDIR}/GameInitDispose.cpp + ${SRCDIR}/GameTick.cpp + ${SRCDIR}/Globals.cpp + ${SRCDIR}/Lights.cpp + ${SRCDIR}/Models.cpp + ${SRCDIR}/Objects.cpp + ${SRCDIR}/pack.c + ${SRCDIR}/pack_private.c + ${SRCDIR}/Person.cpp + ${SRCDIR}/private.c + ${SRCDIR}/Quaternions.cpp + ${SRCDIR}/Random.c + ${SRCDIR}/Skeleton.cpp + ${SRCDIR}/Skybox.cpp + ${SRCDIR}/Sprites.cpp + ${SRCDIR}/Terrain.cpp + ${SRCDIR}/Text.cpp + ${SRCDIR}/TGALoader.cpp + ${SRCDIR}/unpack.c + ${SRCDIR}/unpack_private.c + ${SRCDIR}/Weapons.cpp + ${SRCDIR}/OpenGL_Windows.cpp + ${SRCDIR}/openal_wrapper.cpp + ${SRCDIR}/WinInput.cpp + ${SRCDIR}/MacCompatibility.cpp +) + +set(LUGARU_H + ${SRCDIR}/Constants.h + ${SRCDIR}/Frustum.h + ${SRCDIR}/Game.h + ${SRCDIR}/Lights.h + ${SRCDIR}/LinkedList.h + ${SRCDIR}/MacCompatibility.h + ${SRCDIR}/Models.h + ${SRCDIR}/Objects.h + ${SRCDIR}/Person.h + ${SRCDIR}/PhysicsMath.h + ${SRCDIR}/Pointer.h + ${SRCDIR}/Quaternions.h + ${SRCDIR}/Random.h + ${SRCDIR}/Skeleton.h + ${SRCDIR}/Skybox.h + ${SRCDIR}/Sprites.h + ${SRCDIR}/TGALoader.h + ${SRCDIR}/Terrain.h + ${SRCDIR}/Text.h + ${SRCDIR}/Weapons.h + ${SRCDIR}/WinInput.h + ${SRCDIR}/alstubs.h + ${SRCDIR}/binio.h + ${SRCDIR}/fmod.h + ${SRCDIR}/fmod_errors.h + ${SRCDIR}/fmod_header.h + ${SRCDIR}/fmoddyn.h + ${SRCDIR}/gamegl.h + ${SRCDIR}/glstubs.h + ${SRCDIR}/md5.h + ${SRCDIR}/mmgr.h + ${SRCDIR}/nommgr.h + ${SRCDIR}/pack_private.h + ${SRCDIR}/private.h + ${SRCDIR}/unpack_private.h +) + +if(WIN32) + if(CMAKE_CROSSCOMPILING) + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj + COMMAND i686-pc-mingw32-windres + -I${SRCDIR}/res + -o ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj + -i${SRCDIR}/res/Lugaru.rc + DEPENDS ${SRCDIR}/res/Lugaru.rc + ) + endif(CMAKE_CROSSCOMPILING) + if(NOT CMAKE_CROSSCOMPILING) + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj + COMMAND windres + -I${SRCDIR}/res + -o ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj + -i${SRCDIR}/res/Lugaru.rc + DEPENDS ${SRCDIR}/res/Lugaru.rc + ) + endif(NOT CMAKE_CROSSCOMPILING) + + # !!! FIXME: get rid of this. + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${SRCDIR}/WinDefs.cpp) + + set(LUGARU_H + ${LUGARU_H} + ${SRCDIR}/WinDefs.h + ${SRCDIR}/res/resource.h) +endif(WIN32) + +if (APPLE) + set(PLATFORM_LIBS "-framework Carbon -framework Cocoa -framework OpenGL -framework OpenAL") +endif (APPLE) + + + +# Deal with dependencies... + find_package(OpenGL REQUIRED) -find_package(GLU REQUIRED) -find_package(SDL REQUIRED) -find_package(OggVorbis REQUIRED) +# force this include dir no matter what, so we get sane headers. +include_directories("${DEPDIR}/OpenGL") + +find_package(OpenAL REQUIRED) # !!! FIXME: package a .dll for Windows? + +option (LUGARU_FORCE_INTERNAL_SDL "Force internal libSDL, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_SDL) + find_package(SDL) +endif (NOT LUGARU_FORCE_INTERNAL_SDL) +if (NOT SDL_FOUND) + message(STATUS "Using internal copy of SDL") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} SDL") + set(SDLDIR "${DEPDIR}/SDL12") + set(SDL_INCLUDE_DIR "${SDLDIR}/include") + set(SDL_LIBRARY "") + if (APPLE) + set(LUGARU_HAS_INTERNAL_SDL True) + set(SDL_LIBRARY + ${SDLDIR}/lib/macosx/libSDL-1.2.0.dylib + ${SDLDIR}/lib/macosx/libSDLmain-osx.a + ) + endif (APPLE) + + if (WINDOWS) + set(LUGARU_HAS_INTERNAL_SDL True) + if (MSVC) + set(SDL_LIBRARY + ${SDLDIR}/lib/win32/msvc/SDL.lib + ${SDLDIR}/lib/win32/msvc/SDLmain.lib + ) + endif (MSVC) + if (MINGW) + set(SDL_LIBRARY + ${SDLDIR}/lib/win32/mingw/libSDL.dll.a + ${SDLDIR}/lib/win32/mingw/libSDLmain.a + ) + endif (MINGW) + endif (WINDOWS) + + if (NOT LUGARU_HAS_INTERNAL_SDL) + message(ERROR "We don't have a prebuilt SDL for this platform.") + endif (NOT LUGARU_HAS_INTERNAL_SDL) +endif (NOT SDL_FOUND) + +option (LUGARU_FORCE_INTERNAL_PNG "Force internal libPNG, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_PNG) + find_package(PNG) +endif (NOT LUGARU_FORCE_INTERNAL_PNG) +if (NOT PNG_FOUND) + message(STATUS "Using internal copy of libpng") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} PNG") + set(PNGDIR "${DEPDIR}/libpng") + set(PNG_INCLUDE_DIR "${PNGDIR}") + set(PNG_LIBRARY "") + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${PNGDIR}/png.c + ${PNGDIR}/pngerror.c + ${PNGDIR}/pngget.c + ${PNGDIR}/pngmem.c + ${PNGDIR}/pngpread.c + ${PNGDIR}/pngread.c + ${PNGDIR}/pngrio.c + ${PNGDIR}/pngrtran.c + ${PNGDIR}/pngrutil.c + ${PNGDIR}/pngset.c + ${PNGDIR}/pngtrans.c + ${PNGDIR}/pngwio.c + ${PNGDIR}/pngwrite.c + ${PNGDIR}/pngwtran.c + ${PNGDIR}/pngwutil.c + ) +endif (NOT PNG_FOUND) + +option (LUGARU_FORCE_INTERNAL_JPEG "Force internal libJPEG, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_JPEG) + find_package(JPEG) +endif (NOT LUGARU_FORCE_INTERNAL_JPEG) +if (NOT JPEG_FOUND) + message(STATUS "Using internal copy of libjpeg") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} JPEG") + set(JPEGDIR "${DEPDIR}/libjpeg") + set(JPEG_INCLUDE_DIR "${JPEGDIR}") + set(JPEG_LIBRARY "") + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${JPEGDIR}/jdapistd.c + ${JPEGDIR}/jdmaster.c + ${JPEGDIR}/jdapimin.c + ${JPEGDIR}/jcapimin.c + ${JPEGDIR}/jdmerge.c + ${JPEGDIR}/jdatasrc.c + ${JPEGDIR}/jdatadst.c + ${JPEGDIR}/jdcoefct.c + ${JPEGDIR}/jdcolor.c + ${JPEGDIR}/jddctmgr.c + ${JPEGDIR}/jdhuff.c + ${JPEGDIR}/jdinput.c + ${JPEGDIR}/jdmainct.c + ${JPEGDIR}/jdmarker.c + ${JPEGDIR}/jdpostct.c + ${JPEGDIR}/jdsample.c + ${JPEGDIR}/jdtrans.c + ${JPEGDIR}/jerror.c + ${JPEGDIR}/jidctflt.c + ${JPEGDIR}/jidctfst.c + ${JPEGDIR}/jidctint.c + ${JPEGDIR}/jmemmgr.c + ${JPEGDIR}/jutils.c + ${JPEGDIR}/jmemnobs.c + ${JPEGDIR}/jquant1.c + ${JPEGDIR}/jquant2.c + ${JPEGDIR}/jcomapi.c + ${JPEGDIR}/jcmarker.c + ${JPEGDIR}/jcapistd.c + ${JPEGDIR}/jcparam.c + ${JPEGDIR}/jcinit.c + ${JPEGDIR}/jcdctmgr.c + ${JPEGDIR}/jccoefct.c + ${JPEGDIR}/jcmainct.c + ${JPEGDIR}/jfdctflt.c + ${JPEGDIR}/jfdctint.c + ${JPEGDIR}/jfdctfst.c + ${JPEGDIR}/jchuff.c + ${JPEGDIR}/jcsample.c + ${JPEGDIR}/jcmaster.c + ${JPEGDIR}/jccolor.c + ${JPEGDIR}/jcprepct.c + ${JPEGDIR}/jcarith.c + ${JPEGDIR}/jdarith.c + ${JPEGDIR}/jaricom.c + ) +endif (NOT JPEG_FOUND) + +option (LUGARU_FORCE_INTERNAL_ZLIB "Force internal zlib, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_ZLIB) + find_package(ZLIB) +endif (NOT LUGARU_FORCE_INTERNAL_ZLIB) +if (NOT ZLIB_FOUND) + message(STATUS "Using internal copy of zlib") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} ZLIB") + set(ZLIBDIR "${DEPDIR}/zlib") + set(ZLIB_INCLUDE_DIR "${ZLIBDIR}") + set(ZLIB_LIBRARIES "") + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${ZLIBDIR}/adler32.c + ${ZLIBDIR}/compress.c + ${ZLIBDIR}/crc32.c + ${ZLIBDIR}/deflate.c + ${ZLIBDIR}/infback.c + ${ZLIBDIR}/inffast.c + ${ZLIBDIR}/inflate.c + ${ZLIBDIR}/inftrees.c + ${ZLIBDIR}/trees.c + ${ZLIBDIR}/uncompr.c + ${ZLIBDIR}/zutil.c + ) +endif (NOT ZLIB_FOUND) + +option (LUGARU_FORCE_INTERNAL_GLU "Force internal libGLU, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_GLU) + find_package(GLU) +endif (NOT LUGARU_FORCE_INTERNAL_GLU) +if (NOT GLU_FOUND) + message(STATUS "Using internal copy of libGLU") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} GLU") + set(GLUDIR "${DEPDIR}/GLU") + set(GLU_INCLUDE_DIR "${GLUDIR}") + set(GLU_LIBRARY "") + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${GLUDIR}/dict.c + ${GLUDIR}/geom.c + ${GLUDIR}/memalloc.c + ${GLUDIR}/mesh.c + ${GLUDIR}/mipmap.c + ${GLUDIR}/normal.c + ${GLUDIR}/priorityq.c + ${GLUDIR}/render.c + ${GLUDIR}/sweep.c + ${GLUDIR}/tess.c + ${GLUDIR}/tessmono.c + ${GLUDIR}/util.c + ) +endif (NOT GLU_FOUND) + +option (LUGARU_FORCE_INTERNAL_VORBIS "Force internal Vorbis, even if there's a system version" False) +if (NOT LUGARU_FORCE_INTERNAL_VORBIS) + find_package(OggVorbis) +endif (NOT LUGARU_FORCE_INTERNAL_VORBIS) +if (NOT OggVorbis_FOUND) + message(STATUS "Using internal copy of Ogg Vorbis") + set(LUGARU_MISSING_DEPS "${LUGARU_MISSING_DEPS} OggVorbis") + set(OGGDIR "${DEPDIR}/libogg") + set(OGG_INCLUDE_DIR "${OGGDIR}/include") + set(OGG_LIBRARY "") + set(VORBISDIR "${DEPDIR}/libvorbis") + set(VORBISFILE_INCLUDE_DIR "${VORBISDIR}/include") + set(VORBISFILE_LIBRARY "") + set(LUGARU_SRCS + ${LUGARU_SRCS} + ${OGGDIR}/src/bitwise.c + ${OGGDIR}/src/framing.c + ${VORBISDIR}/lib/analysis.c + ${VORBISDIR}/lib/bitrate.c + ${VORBISDIR}/lib/block.c + ${VORBISDIR}/lib/codebook.c + ${VORBISDIR}/lib/envelope.c + ${VORBISDIR}/lib/floor0.c + ${VORBISDIR}/lib/floor1.c + ${VORBISDIR}/lib/info.c + ${VORBISDIR}/lib/lpc.c + ${VORBISDIR}/lib/lsp.c + ${VORBISDIR}/lib/mapping0.c + ${VORBISDIR}/lib/mdct.c + ${VORBISDIR}/lib/psy.c + ${VORBISDIR}/lib/registry.c + ${VORBISDIR}/lib/res0.c + ${VORBISDIR}/lib/sharedbook.c + ${VORBISDIR}/lib/smallft.c + ${VORBISDIR}/lib/synthesis.c + ${VORBISDIR}/lib/vorbisfile.c + ${VORBISDIR}/lib/window.c + ) +endif (NOT OggVorbis_FOUND) include_directories( - ${OPENAL_INCLUDES} - ${JPEG_INCLUDE_DIR} - ${PNG_INCLUDE_DIR} - ${ZLIB_INCLUDE_DIR} - ${OPENGL_INCLUDE_DIR} - ${GLU_INCLUDE_DIR} - ${SDL_INCLUDE_DIR} - ${VORBISFILE_INCLUDE_DIR} - ${OGG_INCLUDE_DIR} - ${CMAKE_SOURCE_DIR}/Source) + ${OPENAL_INCLUDE_DIR} + ${JPEG_INCLUDE_DIR} + ${PNG_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIR} + ${OPENGL_INCLUDE_DIR} + ${GLU_INCLUDE_DIR} + ${SDL_INCLUDE_DIR} + ${VORBISFILE_INCLUDE_DIR} + ${OGG_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR}/Source +) -set(LUGARU_LIBS ${OPENAL_LIBRARY} ${PNG_LIBRARY} ${JPEG_LIBRARY} ${ZLIB_LIBRARIES} ${SDL_LIBRARY} ${GLU_LIBRARY} ${OPENGL_LIBRARY} ${VORBISFILE_LIBRARY} ${OGG_LIBRARY}) +set(LUGARU_LIBS ${OPENAL_LIBRARY} ${PNG_LIBRARY} ${JPEG_LIBRARY} ${ZLIB_LIBRARIES} ${SDL_LIBRARY} ${GLU_LIBRARY} ${OPENGL_LIBRARY} ${VORBISFILE_LIBRARY} ${OGG_LIBRARY} ${PLATFORM_LIBS}) -add_subdirectory(Source) + +if(WIN32) + add_executable(lugaru ${LUGARU_SRCS} ${LUGARU_H} lugaru_resource.obj) +else(WIN32) + add_executable(lugaru ${LUGARU_SRCS} ${LUGARU_H}) +endif(WIN32) + +target_link_libraries(lugaru ${LUGARU_LIBS}) + +if(WIN32) + add_definitions(-DUSE_OPENAL=1 -DUSE_SDL=1 -DBinIO_STDINT_HEADER=) +else(WIN32) + add_definitions(-DPLATFORM_LINUX=1 -DPLATFORM_UNIX=1 -DUSE_OPENAL=1 -DUSE_SDL=1 -DBinIO_STDINT_HEADER=) +endif(WIN32) # Install target if(WIN32) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/Source/lugaru.exe DESTINATION ${CMAKE_INSTALL_PREFIX}) + if(MSVC) + install(FILES ${SDLDIR}/lib/win32/msvc/SDL.dll DESTINATION ${CMAKE_INSTALL_PREFIX}) + endif(MSVC) + if(MINGW) + install(FILES ${SDLDIR}/lib/win32/mingw/SDL.dll DESTINATION ${CMAKE_INSTALL_PREFIX}) + endif(MINGW) else(WIN32) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/Source/lugaru DESTINATION ${CMAKE_INSTALL_PREFIX}) endif(WIN32) install(DIRECTORY ${CMAKE_SOURCE_DIR}/Data DESTINATION ${CMAKE_INSTALL_PREFIX}) +if (LUGARU_MISSING_DEPS) + message(STATUS "Using our copy of these libs: ${LUGARU_MISSING_DEPS}") +endif (LUGARU_MISSING_DEPS) + diff --git a/Dependencies/OpenGL/GL/mesa_wgl.h b/Dependencies/OpenGL/GL/mesa_wgl.h new file mode 100644 index 0000000..ca2e1b8 --- /dev/null +++ b/Dependencies/OpenGL/GL/mesa_wgl.h @@ -0,0 +1,121 @@ +/* + * Mesa 3-D graphics library + * Version: 3.1 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* prototypes for the Mesa WGL functions */ +/* relocated here so that I could make GLUT get them properly */ + +#ifndef _mesa_wgl_h_ +#define _mesa_wgl_h_ + +#if defined(__MINGW32__) +# define __W32API_USE_DLLIMPORT__ +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef WGLAPI +#define WGLAPI GLAPI +#endif + +#if defined(__MINGW32__) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# include +#endif + + +#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) +#ifndef _GNU_H_WINDOWS32_FUNCTIONS +# ifdef UNICODE +# define wglUseFontBitmaps wglUseFontBitmapsW +# define wglUseFontOutlines wglUseFontOutlinesW +# else +# define wglUseFontBitmaps wglUseFontBitmapsA +# define wglUseFontOutlines wglUseFontOutlinesA +# endif /* !UNICODE */ +#endif /* _GNU_H_WINDOWS32_FUNCTIONS */ +typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR; +typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT; +typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR; +#endif + + +#ifdef _MSC_VER +# pragma warning( disable : 4615 ) /* pragma warning : unknown user warning type*/ +# pragma warning( push ) +# pragma warning( disable : 4273 ) /* 'function' : inconsistent DLL linkage. dllexport assumed. */ +#endif + + +WGLAPI int GLAPIENTRY wglSetPixelFormat(HDC, int, const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY wglSwapBuffers(HDC hdc); +WGLAPI int GLAPIENTRY wglChoosePixelFormat(HDC, const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY wglDescribePixelFormat(HDC,int, unsigned int, LPPIXELFORMATDESCRIPTOR); +WGLAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc); + +WGLAPI int GLAPIENTRY wglCopyContext(HGLRC, HGLRC, unsigned int); +WGLAPI HGLRC GLAPIENTRY wglCreateContext(HDC); +WGLAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC,int); +WGLAPI int GLAPIENTRY wglDeleteContext(HGLRC); +WGLAPI int GLAPIENTRY wglDescribeLayerPlane(HDC, int, int, unsigned int,LPLAYERPLANEDESCRIPTOR); +WGLAPI HGLRC GLAPIENTRY wglGetCurrentContext(void); +WGLAPI HDC GLAPIENTRY wglGetCurrentDC(void); +WGLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC, int, int, int,COLORREF *); +WGLAPI PROC GLAPIENTRY wglGetProcAddress(const char*); +WGLAPI int GLAPIENTRY wglMakeCurrent(HDC,HGLRC); +WGLAPI int GLAPIENTRY wglRealizeLayerPalette(HDC, int, int); +WGLAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC, int, int, int,const COLORREF *); +WGLAPI int GLAPIENTRY wglShareLists(HGLRC, HGLRC); +WGLAPI int GLAPIENTRY wglSwapLayerBuffers(HDC, unsigned int); +WGLAPI int GLAPIENTRY wglUseFontBitmapsA(HDC, unsigned long, unsigned long, unsigned long); +WGLAPI int GLAPIENTRY wglUseFontBitmapsW(HDC, unsigned long, unsigned long, unsigned long); +WGLAPI int GLAPIENTRY wglUseFontOutlinesA(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT); +WGLAPI int GLAPIENTRY wglUseFontOutlinesW(HDC, unsigned long, unsigned long, unsigned long, float,float, int, LPGLYPHMETRICSFLOAT); + +#ifndef __MINGW32__ +WGLAPI int GLAPIENTRY SwapBuffers(HDC); +WGLAPI int GLAPIENTRY ChoosePixelFormat(HDC,const PIXELFORMATDESCRIPTOR *); +WGLAPI int GLAPIENTRY DescribePixelFormat(HDC,int,unsigned int,LPPIXELFORMATDESCRIPTOR); +WGLAPI int GLAPIENTRY GetPixelFormat(HDC); +WGLAPI int GLAPIENTRY SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR *); +#endif + + +#ifdef _MSC_VER +# pragma warning( pop ) +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* _mesa_wgl_h_ */ diff --git a/Dependencies/SDL12/lib/win32/mingw32/SDL.dll b/Dependencies/SDL12/lib/win32/mingw32/SDL.dll new file mode 100755 index 0000000..49f8aa0 Binary files /dev/null and b/Dependencies/SDL12/lib/win32/mingw32/SDL.dll differ diff --git a/Dependencies/SDL12/lib/win32/mingw32/libSDL.dll.a b/Dependencies/SDL12/lib/win32/mingw32/libSDL.dll.a new file mode 100755 index 0000000..64772b0 Binary files /dev/null and b/Dependencies/SDL12/lib/win32/mingw32/libSDL.dll.a differ diff --git a/Dependencies/SDL12/lib/win32/mingw32/libSDL.la b/Dependencies/SDL12/lib/win32/mingw32/libSDL.la new file mode 100755 index 0000000..4f0519f --- /dev/null +++ b/Dependencies/SDL12/lib/win32/mingw32/libSDL.la @@ -0,0 +1,41 @@ +# libSDL.la - a libtool library file +# Generated by ltmain.sh (GNU libtool) 2.2.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='../bin/SDL.dll' + +# Names of this library. +library_names='libSDL.dll.a' + +# The name of the static archive. +old_library='libSDL.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -luser32 -lgdi32 -lwinmm -ldxguid' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libSDL. +current=11 +age=11 +revision=3 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/Dependencies/SDL12/lib/win32/mingw32/libSDLmain.a b/Dependencies/SDL12/lib/win32/mingw32/libSDLmain.a new file mode 100644 index 0000000..068941a Binary files /dev/null and b/Dependencies/SDL12/lib/win32/mingw32/libSDLmain.a differ diff --git a/Dependencies/SDL12/lib/win32/msvc/SDL.dll b/Dependencies/SDL12/lib/win32/msvc/SDL.dll new file mode 100755 index 0000000..628cdfc Binary files /dev/null and b/Dependencies/SDL12/lib/win32/msvc/SDL.dll differ diff --git a/Dependencies/SDL12/lib/win32/msvc/SDL.lib b/Dependencies/SDL12/lib/win32/msvc/SDL.lib new file mode 100755 index 0000000..5b3f17c Binary files /dev/null and b/Dependencies/SDL12/lib/win32/msvc/SDL.lib differ diff --git a/Dependencies/SDL12/lib/win32/msvc/SDLmain.lib b/Dependencies/SDL12/lib/win32/msvc/SDLmain.lib new file mode 100755 index 0000000..945b9ad Binary files /dev/null and b/Dependencies/SDL12/lib/win32/msvc/SDLmain.lib differ diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt deleted file mode 100644 index b159c58..0000000 --- a/Source/CMakeLists.txt +++ /dev/null @@ -1,151 +0,0 @@ -set(LUGARU_SRCS - Frustum.cpp - GameDraw.cpp - GameInitDispose.cpp - GameTick.cpp - Globals.cpp - Lights.cpp - Models.cpp - Objects.cpp - OpenGL_Windows.cpp - Person.cpp - Quaternions.cpp - Random.c - Skeleton.cpp - Skybox.cpp - Sprites.cpp - TGALoader.cpp - Terrain.cpp - Text.cpp - Weapons.cpp - WinInput.cpp - mmgr.cpp - nsp_network.c - openal_wrapper.cpp - pack.c - pack_private.c - private.c - unpack.c - unpack_private.c) - -set(LUGARU_SRCS - Frustum.cpp - GameDraw.cpp - GameInitDispose.cpp - GameTick.cpp - Globals.cpp - Lights.cpp - Models.cpp - Objects.cpp - pack.c - pack_private.c - Person.cpp - private.c - Quaternions.cpp - Random.c - Skeleton.cpp - Skybox.cpp - Sprites.cpp - Terrain.cpp - Text.cpp - TGALoader.cpp - unpack.c - unpack_private.c - Weapons.cpp - MacCompatibility.cpp - OpenGL_Windows.cpp - openal_wrapper.cpp - WinInput.cpp) - -set(LUGARU_H - Constants.h - Frustum.h - Game.h - Lights.h - LinkedList.h - MacCompatibility.h - Models.h - Objects.h - Person.h - PhysicsMath.h - Pointer.h - Quaternions.h - Random.h - Skeleton.h - Skybox.h - Sprites.h - TGALoader.h - Terrain.h - Text.h - Weapons.h - WinInput.h - alstubs.h - binio.h - fmod.h - fmod_errors.h - fmod_header.h - fmoddyn.h - gamegl.h - glstubs.h - md5.h - mmgr.h - nommgr.h - pack_private.h - private.h - unpack_private.h - wincompat.h) - -if(CMAKE_HOST_APPLE) - set(LUGARU_SRCS - ${LUGARU_SRCS} - MacCompatibility.cpp) - set(LUGARU_H - ${LUGARU_H} - "Carbon Include.h" - CarbonStdCLib.h) -endif(CMAKE_HOST_APPLE) - -if(WIN32) - if(CMAKE_CROSSCOMPILING) - ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj - COMMAND i686-pc-mingw32-windres - -I${CMAKE_CURRENT_SOURCE_DIR}/res - -o ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj - -i${CMAKE_CURRENT_SOURCE_DIR}/res/lugaru.rc - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/res/lugaru.rc - ) - endif(CMAKE_CROSSCOMPILING) - if(NOT CMAKE_CROSSCOMPILING) - ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj - COMMAND windres - -I${CMAKE_CURRENT_SOURCE_DIR}/res - -o ${CMAKE_CURRENT_BINARY_DIR}/lugaru_resource.obj - -i${CMAKE_CURRENT_SOURCE_DIR}/res/lugaru.rc - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/res/lugaru.rc - ) - endif(NOT CMAKE_CROSSCOMPILING) - - set(LUGARU_SRCS - ${LUGARU_SRCS} - WinDefs.cpp) - - set(LUGARU_H - ${LUGARU_H} - WinDefs.h - res/resource.h) -endif(WIN32) - -if(WIN32) -add_executable(lugaru ${LUGARU_SRCS} ${LUGARU_H} lugaru_resource.obj) -else(WIN32) -add_executable(lugaru ${LUGARU_SRCS} ${LUGARU_H}) -endif(WIN32) - -target_link_libraries(lugaru ${LUGARU_LIBS}) - -if(WIN32) - add_definitions(-DUSE_OPENAL=1 -DUSE_SDL=1 -DBinIO_STDINT_HEADER=) -else(WIN32) - add_definitions(-DPLATFORM_LINUX=1 -DPLATFORM_UNIX=1 -DUSE_OPENAL=1 -DUSE_SDL=1 -DBinIO_STDINT_HEADER=) -endif(WIN32) - diff --git a/Source/MacCompatibility.h b/Source/MacCompatibility.h index 8c179db..3a99c52 100644 --- a/Source/MacCompatibility.h +++ b/Source/MacCompatibility.h @@ -30,6 +30,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // stuff to make Mac code compatable with Windows/Linux/etc +#if defined(WIN32) && !defined(strcasecmp) +#define strcasecmp(a,b) stricmp(a,b) +#endif + #ifdef _MSC_VER // disable warnings about double to float conversions #pragma warning(disable:4305) diff --git a/Source/MacInput.cpp b/Source/MacInput.cpp deleted file mode 100644 index f695273..0000000 --- a/Source/MacInput.cpp +++ /dev/null @@ -1,824 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/**> HEADER FILES <**/ -#include "MacInput.h" -#include "String.h" - -extern bool keyboardfrozen; - -/********************> IsKeyDown() <*****/ -Boolean IsKeyDown( unsigned char *keyMap, unsigned short theKey ) -{ - if(keyboardfrozen)return 0; - - static long keyMapIndex; - static Boolean isKeyDown; - static short bitToCheck; - - // Calculate the key map index - keyMapIndex = keyMap[theKey/8]; - - // Calculate the individual bit to check - bitToCheck = theKey%8; - - // Check the status of the key - isKeyDown = ( keyMapIndex >> bitToCheck ) & 0x01; - - // Return the status of the key - return isKeyDown; - -} - -unsigned short CharToKey(const char* which) -{ - if(!strcmp(which,"a")){ - return MAC_A_KEY; - } - if(!strcmp(which,"b")){ - return MAC_B_KEY; - } - if(!strcmp(which,"c")){ - return MAC_C_KEY; - } - if(!strcmp(which,"d")){ - return MAC_D_KEY; - } - if(!strcmp(which,"e")){ - return MAC_E_KEY; - } - if(!strcmp(which,"f")){ - return MAC_F_KEY; - } - if(!strcmp(which,"g")){ - return MAC_G_KEY; - } - if(!strcmp(which,"h")){ - return MAC_H_KEY; - } - if(!strcmp(which,"i")){ - return MAC_I_KEY; - } - if(!strcmp(which,"j")){ - return MAC_J_KEY; - } - if(!strcmp(which,"k")){ - return MAC_K_KEY; - } - if(!strcmp(which,"l")){ - return MAC_L_KEY; - } - if(!strcmp(which,"m")){ - return MAC_M_KEY; - } - if(!strcmp(which,"n")){ - return MAC_N_KEY; - } - if(!strcmp(which,"o")){ - return MAC_O_KEY; - } - if(!strcmp(which,"p")){ - return MAC_P_KEY; - } - if(!strcmp(which,"q")){ - return MAC_Q_KEY; - } - if(!strcmp(which,"r")){ - return MAC_R_KEY; - } - if(!strcmp(which,"s")){ - return MAC_S_KEY; - } - if(!strcmp(which,"t")){ - return MAC_T_KEY; - } - if(!strcmp(which,"u")){ - return MAC_U_KEY; - } - if(!strcmp(which,"v")){ - return MAC_V_KEY; - } - if(!strcmp(which,"w")){ - return MAC_W_KEY; - } - if(!strcmp(which,"x")){ - return MAC_X_KEY; - } - if(!strcmp(which,"y")){ - return MAC_Y_KEY; - } - if(!strcmp(which,"z")){ - return MAC_Z_KEY; - } - if(!strcmp(which,"0")){ - return MAC_NUMPAD_0_KEY; - } - if(!strcmp(which,"1")){ - return MAC_NUMPAD_1_KEY; - } - if(!strcmp(which,"2")){ - return MAC_NUMPAD_2_KEY; - } - if(!strcmp(which,"3")){ - return MAC_NUMPAD_3_KEY; - } - if(!strcmp(which,"4")){ - return MAC_NUMPAD_4_KEY; - } - if(!strcmp(which,"5")){ - return MAC_NUMPAD_5_KEY; - } - if(!strcmp(which,"6")){ - return MAC_NUMPAD_6_KEY; - } - if(!strcmp(which,"7")){ - return MAC_NUMPAD_7_KEY; - } - if(!strcmp(which,"8")){ - return MAC_NUMPAD_8_KEY; - } - if(!strcmp(which,"9")){ - return MAC_NUMPAD_9_KEY; - } - if(!strcmp(which,"enter")){ - return MAC_ENTER_KEY; - } - if(!strcmp(which,"control")){ - return MAC_CONTROL_KEY; - } - if(!strcmp(which,"return")){ - return MAC_RETURN_KEY; - } - if(!strcmp(which,"space")){ - return MAC_SPACE_KEY; - } - if(!strcmp(which,"shift")){ - return MAC_SHIFT_KEY; - } - if(!strcmp(which,"uparrow")){ - return MAC_ARROW_UP_KEY; - } - if(!strcmp(which,"downarrow")){ - return MAC_ARROW_DOWN_KEY; - } - if(!strcmp(which,"leftarrow")){ - return MAC_ARROW_LEFT_KEY; - } - if(!strcmp(which,"rightarrow")){ - return MAC_ARROW_RIGHT_KEY; - } -} - -const char* KeyToChar(unsigned short which) -{ - static int i; - - if(which==MAC_A_KEY){ - return "a"; - } - if(which==MAC_B_KEY){ - return "b"; - } - if(which==MAC_C_KEY){ - return "c"; - } - if(which==MAC_D_KEY){ - return "d"; - } - if(which==MAC_E_KEY){ - return "e"; - } - if(which==MAC_F_KEY){ - return "f"; - } - if(which==MAC_G_KEY){ - return "g"; - } - if(which==MAC_H_KEY){ - return "h"; - } - if(which==MAC_I_KEY){ - return "i"; - } - if(which==MAC_J_KEY){ - return "j"; - } - if(which==MAC_K_KEY){ - return "k"; - } - if(which==MAC_L_KEY){ - return "l"; - } - if(which==MAC_M_KEY){ - return "m"; - } - if(which==MAC_N_KEY){ - return "n"; - } - if(which==MAC_O_KEY){ - return "o"; - } - if(which==MAC_P_KEY){ - return "p"; - } - if(which==MAC_Q_KEY){ - return "q"; - } - if(which==MAC_R_KEY){ - return "r"; - } - if(which==MAC_S_KEY){ - return "s"; - } - if(which==MAC_T_KEY){ - return "t"; - } - if(which==MAC_U_KEY){ - return "u"; - } - if(which==MAC_V_KEY){ - return "v"; - } - if(which==MAC_W_KEY){ - return "w"; - } - if(which==MAC_X_KEY){ - return "x"; - } - if(which==MAC_Y_KEY){ - return "y"; - } - if(which==MAC_Z_KEY){ - return "z"; - } - if(which==MAC_NUMPAD_1_KEY){ - return "1"; - } - if(which==MAC_NUMPAD_2_KEY){ - return "2"; - } - if(which==MAC_NUMPAD_3_KEY){ - return "3"; - } - if(which==MAC_NUMPAD_4_KEY){ - return "4"; - } - if(which==MAC_NUMPAD_5_KEY){ - return "5"; - } - if(which==MAC_NUMPAD_6_KEY){ - return "6"; - } - if(which==MAC_NUMPAD_7_KEY){ - return "7"; - } - if(which==MAC_NUMPAD_8_KEY){ - return "8"; - } - if(which==MAC_NUMPAD_9_KEY){ - return "9"; - } - if(which==MAC_ENTER_KEY){ - return "enter"; - } - if(which==MAC_NUMPAD_0_KEY){ - return "0"; - } - if(which==MAC_1_KEY){ - return "1"; - } - if(which==MAC_2_KEY){ - return "2"; - } - if(which==MAC_3_KEY){ - return "3"; - } - if(which==MAC_4_KEY){ - return "4"; - } - if(which==MAC_5_KEY){ - return "5"; - } - if(which==MAC_6_KEY){ - return "6"; - } - if(which==MAC_7_KEY){ - return "7"; - } - if(which==MAC_8_KEY){ - return "8"; - } - if(which==MAC_9_KEY){ - return "9"; - } - if(which==MAC_0_KEY){ - return "0"; - } - if(which==MAC_F1_KEY){ - return "F1"; - } - if(which==MAC_F2_KEY){ - return "F2"; - } - if(which==MAC_F3_KEY){ - return "F3"; - } - if(which==MAC_F4_KEY){ - return "F4"; - } - if(which==MAC_F5_KEY){ - return "F5"; - } - if(which==MAC_F6_KEY){ - return "F6"; - } - if(which==MAC_F7_KEY){ - return "F7"; - } - if(which==MAC_F8_KEY){ - return "F8"; - } - if(which==MAC_F9_KEY){ - return "F9"; - } - if(which==MAC_F10_KEY){ - return "F10"; - } - if(which==MAC_F11_KEY){ - return "F11"; - } - if(which==MAC_F12_KEY){ - return "F12"; - } - if(which==MAC_ESCAPE_KEY){ - return "escape"; - } - if(which==MAC_DELETE_KEY){ - return "backspace"; - } - if(which==MAC_TAB_KEY){ - return "tab"; - } - if(which==MAC_TILDE_KEY){ - return "`"; - } - if(which==MAC_CAPS_LOCK_KEY){ - return "caps lock"; - } - if(which==MAC_COMMAND_KEY){ - return "command"; - } - if(which==MAC_OPTION_KEY){ - return "option"; - } - if(which==MAC_DEL_KEY){ - return "delete"; - } - if(which==MAC_INSERT_KEY){ - return "insert"; - } - if(which==MAC_HOME_KEY){ - return "home"; - } - if(which==MAC_END_KEY){ - return "end"; - } - if(which==MAC_PAGE_UP_KEY){ - return "page up"; - } - if(which==MAC_PAGE_DOWN_KEY){ - return "page down"; - } - if(which==MAC_NUMPAD_CLEAR_KEY){ - return "clear"; - } - if(which==MAC_CONTROL_KEY){ - return "control"; - } - if(which==MAC_SPACE_KEY){ - return "space"; - } - if(which==MAC_RETURN_KEY){ - return "return"; - } - if(which==MAC_SHIFT_KEY){ - return "shift"; - } - if(which==MAC_ARROW_UP_KEY){ - return "uparrow"; - } - if(which==MAC_ARROW_DOWN_KEY){ - return "downarrow"; - } - if(which==MAC_ARROW_LEFT_KEY){ - return "leftarrow"; - } - if(which==MAC_ARROW_RIGHT_KEY){ - return "rightarrow"; - } - if(which==MAC_MINUS_KEY||which==MAC_NUMPAD_MINUS_KEY){ - return "-"; - } - if(which==MAC_PLUS_KEY||which==MAC_NUMPAD_EQUALS_KEY){ - return "="; - } - if(which==MAC_NUMPAD_PLUS_KEY){ - return "+"; - } - if(which==MAC_NUMPAD_ASTERISK_KEY){ - return "*"; - } - if(which==MAC_SLASH_KEY||which==MAC_NUMPAD_SLASH_KEY){ - return "/"; - } - if(which==MAC_BACKSLASH_KEY){ - return "\\"; - } - if(which==MAC_LEFTBRACKET_KEY){ - return "["; - } - if(which==MAC_RIGHTBRACKET_KEY){ - return "]"; - } - if(which==MAC_PERIOD_KEY||which==MAC_NUMPAD_PERIOD_KEY){ - return "."; - } - if(which==MAC_COMMA_KEY){ - return ","; - } - if(which==MAC_APOSTROPHE_KEY){ - return "\""; - } - if(which==MAC_SEMICOLON_KEY){ - return ";"; - } - return "unknown"; -} - -char KeyToSingleChar(unsigned short which) -{ - static int i; - - if(which==MAC_A_KEY){ - return 'a'; - } - if(which==MAC_B_KEY){ - return 'b'; - } - if(which==MAC_C_KEY){ - return 'c'; - } - if(which==MAC_D_KEY){ - return 'd'; - } - if(which==MAC_E_KEY){ - return 'e'; - } - if(which==MAC_F_KEY){ - return 'f'; - } - if(which==MAC_G_KEY){ - return 'g'; - } - if(which==MAC_H_KEY){ - return 'h'; - } - if(which==MAC_I_KEY){ - return 'i'; - } - if(which==MAC_J_KEY){ - return 'j'; - } - if(which==MAC_K_KEY){ - return 'k'; - } - if(which==MAC_L_KEY){ - return 'l'; - } - if(which==MAC_M_KEY){ - return 'm'; - } - if(which==MAC_N_KEY){ - return 'n'; - } - if(which==MAC_O_KEY){ - return 'o'; - } - if(which==MAC_P_KEY){ - return 'p'; - } - if(which==MAC_Q_KEY){ - return 'q'; - } - if(which==MAC_R_KEY){ - return 'r'; - } - if(which==MAC_S_KEY){ - return 's'; - } - if(which==MAC_T_KEY){ - return 't'; - } - if(which==MAC_U_KEY){ - return 'u'; - } - if(which==MAC_V_KEY){ - return 'v'; - } - if(which==MAC_W_KEY){ - return 'w'; - } - if(which==MAC_X_KEY){ - return 'x'; - } - if(which==MAC_Y_KEY){ - return 'y'; - } - if(which==MAC_Z_KEY){ - return 'z'; - } - if(which==MAC_NUMPAD_1_KEY){ - return '1'; - } - if(which==MAC_NUMPAD_2_KEY){ - return '2'; - } - if(which==MAC_NUMPAD_3_KEY){ - return '3'; - } - if(which==MAC_NUMPAD_4_KEY){ - return '4'; - } - if(which==MAC_NUMPAD_5_KEY){ - return '5'; - } - if(which==MAC_NUMPAD_6_KEY){ - return '6'; - } - if(which==MAC_NUMPAD_7_KEY){ - return '7'; - } - if(which==MAC_NUMPAD_8_KEY){ - return '8'; - } - if(which==MAC_NUMPAD_9_KEY){ - return '9'; - } - if(which==MAC_NUMPAD_0_KEY){ - return '0'; - } - if(which==MAC_1_KEY){ - return '1'; - } - if(which==MAC_2_KEY){ - return '2'; - } - if(which==MAC_3_KEY){ - return '3'; - } - if(which==MAC_4_KEY){ - return '4'; - } - if(which==MAC_5_KEY){ - return '5'; - } - if(which==MAC_6_KEY){ - return '6'; - } - if(which==MAC_7_KEY){ - return '7'; - } - if(which==MAC_8_KEY){ - return '8'; - } - if(which==MAC_9_KEY){ - return '9'; - } - if(which==MAC_0_KEY){ - return '0'; - } - if(which==MAC_SPACE_KEY){ - return ' '; - } - if(which==MAC_MINUS_KEY||which==MAC_NUMPAD_MINUS_KEY){ - return '-'; - } - if(which==MAC_PLUS_KEY||which==MAC_NUMPAD_EQUALS_KEY){ - return '='; - } - if(which==MAC_NUMPAD_PLUS_KEY){ - return '+'; - } - if(which==MAC_NUMPAD_ASTERISK_KEY){ - return '*'; - } - if(which==MAC_SLASH_KEY||which==MAC_NUMPAD_SLASH_KEY){ - return '/'; - } - if(which==MAC_BACKSLASH_KEY){ - return '\\'; - } - if(which==MAC_LEFTBRACKET_KEY){ - return '['; - } - if(which==MAC_RIGHTBRACKET_KEY){ - return ']'; - } - if(which==MAC_PERIOD_KEY||which==MAC_NUMPAD_PERIOD_KEY){ - return '.'; - } - if(which==MAC_COMMA_KEY){ - return ','; - } - if(which==MAC_APOSTROPHE_KEY){ - return '\''; - } - if(which==MAC_SEMICOLON_KEY){ - return ';'; - } - return '\0'; -} - -char Shift(char which) -{ - static int i; - - if(which=='a'){ - return 'A'; - } - if(which=='b'){ - return 'B'; - } - if(which=='c'){ - return 'C'; - } - if(which=='d'){ - return 'D'; - } - if(which=='e'){ - return 'E'; - } - if(which=='f'){ - return 'F'; - } - if(which=='g'){ - return 'G'; - } - if(which=='h'){ - return 'H'; - } - if(which=='e'){ - return 'E'; - } - if(which=='f'){ - return 'F'; - } - if(which=='g'){ - return 'G'; - } - if(which=='h'){ - return 'H'; - } - if(which=='i'){ - return 'I'; - } - if(which=='j'){ - return 'J'; - } - if(which=='k'){ - return 'K'; - } - if(which=='l'){ - return 'L'; - } - if(which=='m'){ - return 'M'; - } - if(which=='n'){ - return 'N'; - } - if(which=='o'){ - return 'O'; - } - if(which=='p'){ - return 'P'; - } - if(which=='q'){ - return 'Q'; - } - if(which=='r'){ - return 'R'; - } - if(which=='s'){ - return 'S'; - } - if(which=='t'){ - return 'T'; - } - if(which=='u'){ - return 'U'; - } - if(which=='v'){ - return 'V'; - } - if(which=='w'){ - return 'W'; - } - if(which=='x'){ - return 'X'; - } - if(which=='y'){ - return 'Y'; - } - if(which=='z'){ - return 'Z'; - } - if(which=='1'){ - return '!'; - } - if(which=='2'){ - return '@'; - } - if(which=='3'){ - return '#'; - } - if(which=='4'){ - return '$'; - } - if(which=='5'){ - return '%'; - } - if(which=='6'){ - return '^'; - } - if(which=='7'){ - return '&'; - } - if(which=='8'){ - return '*'; - } - if(which=='9'){ - return '('; - } - if(which=='0'){ - return ')'; - } - if(which=='-'){ - return '_'; - } - if(which=='='){ - return '+'; - } - if(which=='['){ - return '{'; - } - if(which==']'){ - return '}'; - } - if(which=='\\'){ - return '|'; - } - if(which=='.'){ - return '>'; - } - if(which==','){ - return '<'; - } - if(which=='/'){ - return '?'; - } - if(which==';'){ - return ':'; - } - if(which=='\''){ - return '\"'; - } - return which; -} - -bool Compare(const char *thestring, const char *tocompare, int start, int end) -{ - static int i; - for(i=start;i<=end;i++){ - if(thestring[i]!=tocompare[i-start]&&thestring[i]!=tocompare[i-start]+'A'-'a')return 0; - } - return 1; -} diff --git a/Source/MacInput.h b/Source/MacInput.h deleted file mode 100644 index 60e65f9..0000000 --- a/Source/MacInput.h +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#ifndef _MACINPUT_H_ -#define _MACINPUT_H_ - -/**> HEADER FILES <**/ -#include -#include -#include //Mouse - -/**> CONSTANT DECLARATIONS <**/ -// Mac Keyboard Codes -#define MAC_1_KEY 0x12 -#define MAC_2_KEY 0x13 -#define MAC_3_KEY 0x14 -#define MAC_4_KEY 0x15 -#define MAC_5_KEY 0x17 -#define MAC_6_KEY 0x16 -#define MAC_7_KEY 0x1A -#define MAC_8_KEY 0x1C -#define MAC_9_KEY 0x19 -#define MAC_0_KEY 0x1D -#define MAC_NUMPAD_1_KEY 0x53 -#define MAC_NUMPAD_2_KEY 0x54 -#define MAC_NUMPAD_3_KEY 0x55 -#define MAC_NUMPAD_4_KEY 0x56 -#define MAC_NUMPAD_5_KEY 0x57 -#define MAC_NUMPAD_6_KEY 0x58 -#define MAC_NUMPAD_7_KEY 0x59 -#define MAC_NUMPAD_8_KEY 0x5B -#define MAC_NUMPAD_9_KEY 0x5C -#define MAC_NUMPAD_0_KEY 0x52 -#define MAC_A_KEY 0x00 -#define MAC_B_KEY 0x0B -#define MAC_C_KEY 0x08 -#define MAC_D_KEY 0x02 -#define MAC_E_KEY 0x0E -#define MAC_F_KEY 0x03 -#define MAC_G_KEY 0x05 -#define MAC_H_KEY 0x04 -#define MAC_I_KEY 0x22 -#define MAC_J_KEY 0x26 -#define MAC_K_KEY 0x28 -#define MAC_L_KEY 0x25 -#define MAC_M_KEY 0x2E -#define MAC_N_KEY 0x2D -#define MAC_O_KEY 0x1F -#define MAC_P_KEY 0x23 -#define MAC_Q_KEY 0x0C -#define MAC_R_KEY 0x0F -#define MAC_S_KEY 0x01 -#define MAC_T_KEY 0x11 -#define MAC_U_KEY 0x20 -#define MAC_V_KEY 0x09 -#define MAC_W_KEY 0x0D -#define MAC_X_KEY 0x07 -#define MAC_Y_KEY 0x10 -#define MAC_Z_KEY 0x06 -#define MAC_F1_KEY 0x7A -#define MAC_F2_KEY 0x78 -#define MAC_F3_KEY 0x63 -#define MAC_F4_KEY 0x76 -#define MAC_F5_KEY 0x60 -#define MAC_F6_KEY 0x61 -#define MAC_F7_KEY 0x62 -#define MAC_F8_KEY 0x64 -#define MAC_F9_KEY 0x65 -#define MAC_F10_KEY 0x6D -#define MAC_F11_KEY 0x67 -#define MAC_F12_KEY 0x6F -#define MAC_RETURN_KEY 0x24 -#define MAC_ENTER_KEY 0x4C -#define MAC_TAB_KEY 0x30 -#define MAC_SPACE_KEY 0x31 -#define MAC_DELETE_KEY 0x33 -#define MAC_ESCAPE_KEY 0x35 -#define MAC_COMMAND_KEY 0x37 -#define MAC_SHIFT_KEY 0x38 -#define MAC_CAPS_LOCK_KEY 0x39 -#define MAC_OPTION_KEY 0x3A -#define MAC_CONTROL_KEY 0x3B -#define MAC_PAGE_UP_KEY 0x74 -#define MAC_PAGE_DOWN_KEY 0x79 -#define MAC_INSERT_KEY 0x72 -#define MAC_DEL_KEY 0x75 -#define MAC_HOME_KEY 0x73 -#define MAC_END_KEY 0x77 -#define MAC_LEFT_BRACKET_KEY 0x21 -#define MAC_RIGHT_BRACKET_KEY 0x1E -#define MAC_ARROW_UP_KEY 0x7E -#define MAC_ARROW_DOWN_KEY 0x7D -#define MAC_ARROW_LEFT_KEY 0x7B -#define MAC_ARROW_RIGHT_KEY 0x7C -#define MAC_TILDE_KEY 0x32 -#define MAC_MINUS_KEY 0x1B -#define MAC_PLUS_KEY 0x18 -#define MAC_SLASH_KEY 0x2C -#define MAC_PERIOD_KEY 0x2F -#define MAC_COMMA_KEY 0x2B -#define MAC_BACKSLASH_KEY 0x2A -#define MAC_LEFTBRACKET_KEY 0x21 -#define MAC_RIGHTBRACKET_KEY 0x1E -#define MAC_NUMPAD_CLEAR_KEY 0x47#define MAC_NUMPAD_MINUS_KEY 0x4E -#define MAC_NUMPAD_EQUALS_KEY 0x51 -#define MAC_NUMPAD_PLUS_KEY 0x45 -#define MAC_NUMPAD_SLASH_KEY 0x4B -#define MAC_NUMPAD_ASTERISK_KEY 0x43 -#define MAC_NUMPAD_ENTER_KEY 0x4C -#define MAC_NUMPAD_PERIOD_KEY 0x41 -#define MAC_SEMICOLON_KEY 0x29 -#define MAC_APOSTROPHE_KEY 0x27 - -/**> FUNCTION PROTOTYPES <**/ -Boolean IsKeyDown( unsigned char *keyMap, unsigned short theKey ); -void InitMouse(); -void MoveMouse(int xcoord, int ycoord, Point *mouseloc); -void RefreshMouse(Point *mouseloc); -void DisposeMouse(); -unsigned short CharToKey(const char* which); -const char* KeyToChar(unsigned short which); -char KeyToSingleChar(unsigned short which); -char Shift(char which); -bool Compare(const char *thestring, const char *tocompare, int start, int end); - -#endif diff --git a/Source/MoreFilesX.c b/Source/MoreFilesX.c deleted file mode 100644 index 43d6910..0000000 --- a/Source/MoreFilesX.c +++ /dev/null @@ -1,2791 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - File: MoreFilesX.c - - Contains: A collection of useful high-level File Manager routines - which use the HFS Plus APIs wherever possible. - - Version: MoreFilesX 1.0.1 - - Copyright: © 1992-2002 by Apple Computer, Inc., all rights reserved. - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - File Ownership: - - DRI: Apple Macintosh Developer Technical Support - - Other Contact: For bug reports, consult the following page on - the World Wide Web: - http://developer.apple.com/bugreporter/ - - Technology: DTS Sample Code - - Writers: - - (JL) Jim Luther - - Change History (most recent first): - - <4> 8/22/02 JL [3016251] Changed FSMoveRenameObjectUnicode to not use - the Temporary folder because it isn't available on - NFS volumes. - <3> 4/19/02 JL [2853905] Fixed #if test around header includes. - <2> 4/19/02 JL [2850624] Fixed C++ compile errors and Project Builder - warnings. - <2> 4/19/02 JL [2853901] Updated standard disclaimer. - <1> 1/25/02 JL MoreFilesX 1.0 -*/ - -#if defined(__MACH__) - #include - #include -#else - #include - #include -#endif - -#include "MoreFilesX.h" - -/* Set BuildingMoreFilesXForMacOS9 to 1 if building for Mac OS 9 */ -#ifndef BuildingMoreFilesXForMacOS9 - #define BuildingMoreFilesXForMacOS9 0 -#endif - -/*****************************************************************************/ - -#pragma mark ----- Local type definitions ----- - -struct FSIterateContainerGlobals -{ - IterateContainerFilterProcPtr iterateFilter; /* pointer to IterateFilterProc */ - FSCatalogInfoBitmap whichInfo; /* fields of the CatalogInfo to get */ - FSCatalogInfo catalogInfo; /* FSCatalogInfo */ - FSRef ref; /* FSRef */ - FSSpec spec; /* FSSpec */ - FSSpec *specPtr; /* pointer to spec field, or NULL */ - HFSUniStr255 name; /* HFSUniStr255 */ - HFSUniStr255 *namePtr; /* pointer to name field, or NULL */ - void *yourDataPtr; /* a pointer to caller supplied data the filter may need to access */ - ItemCount maxLevels; /* maximum levels to iterate through */ - ItemCount currentLevel; /* the current level FSIterateContainerLevel is on */ - Boolean quitFlag; /* set to true if filter wants to kill interation */ - Boolean containerChanged; /* temporary - set to true if the current container changed during iteration */ - OSErr result; /* result */ - ItemCount actualObjects; /* number of objects returned */ -}; -typedef struct FSIterateContainerGlobals FSIterateContainerGlobals; - -struct FSDeleteContainerGlobals -{ - OSErr result; /* result */ - ItemCount actualObjects; /* number of objects returned */ - FSCatalogInfo catalogInfo; /* FSCatalogInfo */ -}; -typedef struct FSDeleteContainerGlobals FSDeleteContainerGlobals; - -/*****************************************************************************/ - -#pragma mark ----- Local prototypes ----- - -static -void -FSDeleteContainerLevel( - const FSRef *container, - FSDeleteContainerGlobals *theGlobals); - -static -void -FSIterateContainerLevel( - FSIterateContainerGlobals *theGlobals); - -static -OSErr -GenerateUniqueHFSUniStr( - long *startSeed, - const FSRef *dir1, - const FSRef *dir2, - HFSUniStr255 *uniqueName); - -/*****************************************************************************/ - -#pragma mark ----- File Access Routines ----- - -/*****************************************************************************/ - -OSErr -FSCopyFork( - SInt16 srcRefNum, - SInt16 dstRefNum, - void *copyBufferPtr, - ByteCount copyBufferSize) -{ - OSErr srcResult; - OSErr dstResult; - OSErr result; - SInt64 forkSize; - ByteCount readActualCount; - - /* check input parameters */ - require_action((NULL != copyBufferPtr) && (0 != copyBufferSize), BadParameter, result = paramErr); - - /* get source fork size */ - result = FSGetForkSize(srcRefNum, &forkSize); - require_noerr(result, SourceFSGetForkSizeFailed); - - /* allocate disk space for destination fork */ - result = FSSetForkSize(dstRefNum, fsFromStart, forkSize); - require_noerr(result, DestinationFSSetForkSizeFailed); - - /* reset source fork's position to 0 */ - result = FSSetForkPosition(srcRefNum, fsFromStart, 0); - require_noerr(result, SourceFSSetForkPositionFailed); - - /* reset destination fork's position to 0 */ - result = FSSetForkPosition(dstRefNum, fsFromStart, 0); - require_noerr(result, DestinationFSSetForkPositionFailed); - - /* If copyBufferSize is greater than 4K bytes, make it a multiple of 4k bytes */ - /* This will make writes on local volumes faster */ - if ( (copyBufferSize >= 0x00001000) && ((copyBufferSize & 0x00000fff) != 0) ) - { - copyBufferSize &= ~(0x00001000 - 1); - } - - /* copy source to destination */ - srcResult = dstResult = noErr; - while ( (noErr == srcResult) && (noErr == dstResult) ) - { - srcResult = FSReadFork(srcRefNum, fsAtMark + noCacheMask, 0, copyBufferSize, copyBufferPtr, &readActualCount); - dstResult = FSWriteFork(dstRefNum, fsAtMark + noCacheMask, 0, readActualCount, copyBufferPtr, NULL); - } - - /* make sure there were no errors at the destination */ - require_noerr_action(dstResult, DestinationFSWriteForkFailed, result = dstResult); - - /* make sure the error at the source was eofErr */ - require_action(eofErr == srcResult, SourceResultNotEofErr, result = srcResult); - - /* everything went as expected */ - result = noErr; - -SourceResultNotEofErr: -DestinationFSWriteForkFailed: -DestinationFSSetForkPositionFailed: -SourceFSSetForkPositionFailed: -DestinationFSSetForkSizeFailed: -SourceFSGetForkSizeFailed: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- Volume Access Routines ----- - -/*****************************************************************************/ - -OSErr -FSGetVolParms( - FSVolumeRefNum volRefNum, - UInt32 bufferSize, - GetVolParmsInfoBuffer *volParmsInfo, - UInt32 *actualInfoSize) -{ - OSErr result; - HParamBlockRec pb; - - /* check parameters */ - require_action((NULL != volParmsInfo) && (NULL != actualInfoSize), - BadParameter, result = paramErr); - - pb.ioParam.ioNamePtr = NULL; - pb.ioParam.ioVRefNum = volRefNum; - pb.ioParam.ioBuffer = (Ptr)volParmsInfo; - pb.ioParam.ioReqCount = (SInt32)bufferSize; - result = PBHGetVolParmsSync(&pb); - require_noerr(result, PBHGetVolParmsSync); - - /* return number of bytes the file system returned in volParmsInfo buffer */ - *actualInfoSize = (UInt32)pb.ioParam.ioActCount; - -PBHGetVolParmsSync: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetVRefNum( - const FSRef *ref, - FSVolumeRefNum *vRefNum) -{ - OSErr result; - FSCatalogInfo catalogInfo; - - /* check parameters */ - require_action(NULL != vRefNum, BadParameter, result = paramErr); - - /* get the volume refNum from the FSRef */ - result = FSGetCatalogInfo(ref, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* return volume refNum from catalogInfo */ - *vRefNum = catalogInfo.volume; - -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetVInfo( - FSVolumeRefNum volume, - HFSUniStr255 *volumeName, /* can be NULL */ - UInt64 *freeBytes, /* can be NULL */ - UInt64 *totalBytes) /* can be NULL */ -{ - OSErr result; - FSVolumeInfo info; - - /* ask for the volume's sizes only if needed */ - result = FSGetVolumeInfo(volume, 0, NULL, - (((NULL != freeBytes) || (NULL != totalBytes)) ? kFSVolInfoSizes : kFSVolInfoNone), - &info, volumeName, NULL); - require_noerr(result, FSGetVolumeInfo); - - if ( NULL != freeBytes ) - { - *freeBytes = info.freeBytes; - } - if ( NULL != totalBytes ) - { - *totalBytes = info.totalBytes; - } - -FSGetVolumeInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetVolFileSystemID( - FSVolumeRefNum volume, - UInt16 *fileSystemID, /* can be NULL */ - UInt16 *signature) /* can be NULL */ -{ - OSErr result; - FSVolumeInfo info; - - result = FSGetVolumeInfo(volume, 0, NULL, kFSVolInfoFSInfo, &info, NULL, NULL); - require_noerr(result, FSGetVolumeInfo); - - if ( NULL != fileSystemID ) - { - *fileSystemID = info.filesystemID; - } - if ( NULL != signature ) - { - *signature = info.signature; - } - -FSGetVolumeInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetMountedVolumes( - FSRef ***volumeRefsHandle, /* pointer to handle of FSRefs */ - ItemCount *numVolumes) -{ - OSErr result; - OSErr memResult; - ItemCount volumeIndex; - FSRef ref; - - /* check parameters */ - require_action((NULL != volumeRefsHandle) && (NULL != numVolumes), - BadParameter, result = paramErr); - - /* No volumes yet */ - *numVolumes = 0; - - /* Allocate a handle for the results */ - *volumeRefsHandle = (FSRef **)NewHandle(0); - require_action(NULL != *volumeRefsHandle, NewHandle, result = memFullErr); - - /* Call FSGetVolumeInfo in loop to get all volumes starting with the first */ - volumeIndex = 1; - do - { - result = FSGetVolumeInfo(0, volumeIndex, NULL, kFSVolInfoNone, NULL, NULL, &ref); - if ( noErr == result ) - { - /* concatenate the FSRef to the end of the handle */ - PtrAndHand(&ref, (Handle)*volumeRefsHandle, sizeof(FSRef)); - memResult = MemError(); - require_noerr_action(memResult, MemoryAllocationFailed, result = memResult); - - ++(*numVolumes); /* increment the volume count */ - ++volumeIndex; /* and the volumeIndex to get the next volume*/ - } - } while ( noErr == result ); - - /* nsvErr is OK -- it just means there are no more volumes */ - require(nsvErr == result, FSGetVolumeInfo); - - return ( noErr ); - - /**********************/ - -MemoryAllocationFailed: -FSGetVolumeInfo: - - /* dispose of handle if already allocated and clear the outputs */ - if ( NULL != *volumeRefsHandle ) - { - DisposeHandle((Handle)*volumeRefsHandle); - *volumeRefsHandle = NULL; - } - *numVolumes = 0; - -NewHandle: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- FSRef/FSpec/Path/Name Conversion Routines ----- - -/*****************************************************************************/ - -OSErr -FSRefMakeFSSpec( - const FSRef *ref, - FSSpec *spec) -{ - OSErr result; - - /* check parameters */ - require_action(NULL != spec, BadParameter, result = paramErr); - - result = FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, NULL, spec, NULL); - require_noerr(result, FSGetCatalogInfo); - -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSMakeFSRef( - FSVolumeRefNum volRefNum, - SInt32 dirID, - ConstStr255Param name, - FSRef *ref) -{ - OSErr result; - FSRefParam pb; - - /* check parameters */ - require_action(NULL != ref, BadParameter, result = paramErr); - - pb.ioVRefNum = volRefNum; - pb.ioDirID = dirID; - pb.ioNamePtr = (StringPtr)name; - pb.newRef = ref; - result = PBMakeFSRefSync(&pb); - require_noerr(result, PBMakeFSRefSync); - -PBMakeFSRefSync: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSStatus -FSMakePath( - SInt16 volRefNum, - SInt32 dirID, - ConstStr255Param name, - UInt8 *path, - UInt32 maxPathSize) -{ - OSStatus result; - FSRef ref; - - /* check parameters */ - require_action(NULL != path, BadParameter, result = paramErr); - - /* convert the inputs to an FSRef */ - result = FSMakeFSRef(volRefNum, dirID, name, &ref); - require_noerr(result, FSMakeFSRef); - - /* and then convert the FSRef to a path */ - result = FSRefMakePath(&ref, path, maxPathSize); - require_noerr(result, FSRefMakePath); - -FSRefMakePath: -FSMakeFSRef: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSStatus -FSPathMakeFSSpec( - const UInt8 *path, - FSSpec *spec, - Boolean *isDirectory) /* can be NULL */ -{ - OSStatus result; - FSRef ref; - - /* check parameters */ - require_action(NULL != spec, BadParameter, result = paramErr); - - /* convert the POSIX path to an FSRef */ - result = FSPathMakeRef(path, &ref, isDirectory); - require_noerr(result, FSPathMakeRef); - - /* and then convert the FSRef to an FSSpec */ - result = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL); - require_noerr(result, FSGetCatalogInfo); - -FSGetCatalogInfo: -FSPathMakeRef: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -UnicodeNameGetHFSName( - UniCharCount nameLength, - const UniChar *name, - TextEncoding textEncodingHint, - Boolean isVolumeName, - Str31 hfsName) -{ - OSStatus result; - ByteCount unicodeByteLength; - ByteCount unicodeBytesConverted; - ByteCount actualPascalBytes; - UnicodeMapping uMapping; - UnicodeToTextInfo utInfo; - - /* check parameters */ - require_action(NULL != hfsName, BadParameter, result = paramErr); - - /* make sure output is valid in case we get errors or there's nothing to convert */ - hfsName[0] = 0; - - unicodeByteLength = nameLength * sizeof(UniChar); - if ( 0 == unicodeByteLength ) - { - /* do nothing */ - result = noErr; - } - else - { - /* if textEncodingHint is kTextEncodingUnknown, get a "default" textEncodingHint */ - if ( kTextEncodingUnknown == textEncodingHint ) - { - ScriptCode script; - RegionCode region; - - script = (ScriptCode)GetScriptManagerVariable(smSysScript); - region = (RegionCode)GetScriptManagerVariable(smRegionCode); - result = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, region, - NULL, &textEncodingHint ); - if ( paramErr == result ) - { - /* ok, ignore the region and try again */ - result = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, - kTextRegionDontCare, NULL, &textEncodingHint ); - } - if ( noErr != result ) - { - /* ok... try something */ - textEncodingHint = kTextEncodingMacRoman; - } - } - - uMapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0, - kUnicodeCanonicalDecompVariant, kUnicode16BitFormat); - uMapping.otherEncoding = GetTextEncodingBase(textEncodingHint); - uMapping.mappingVersion = kUnicodeUseHFSPlusMapping; - - result = CreateUnicodeToTextInfo(&uMapping, &utInfo); - require_noerr(result, CreateUnicodeToTextInfo); - - result = ConvertFromUnicodeToText(utInfo, unicodeByteLength, name, kUnicodeLooseMappingsMask, - 0, NULL, 0, NULL, /* offsetCounts & offsetArrays */ - isVolumeName ? kHFSMaxVolumeNameChars : kHFSMaxFileNameChars, - &unicodeBytesConverted, &actualPascalBytes, &hfsName[1]); - require_noerr(result, ConvertFromUnicodeToText); - - hfsName[0] = (unsigned char)actualPascalBytes; /* fill in length byte */ - -ConvertFromUnicodeToText: - - /* verify the result in debug builds -- there's really not anything you can do if it fails */ - verify_noerr(DisposeUnicodeToTextInfo(&utInfo)); - } - -CreateUnicodeToTextInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -HFSNameGetUnicodeName( - ConstStr31Param hfsName, - TextEncoding textEncodingHint, - HFSUniStr255 *unicodeName) -{ - ByteCount unicodeByteLength; - OSStatus result; - UnicodeMapping uMapping; - TextToUnicodeInfo tuInfo; - ByteCount pascalCharsRead; - - /* check parameters */ - require_action(NULL != unicodeName, BadParameter, result = paramErr); - - /* make sure output is valid in case we get errors or there's nothing to convert */ - unicodeName->length = 0; - - if ( 0 == StrLength(hfsName) ) - { - result = noErr; - } - else - { - /* if textEncodingHint is kTextEncodingUnknown, get a "default" textEncodingHint */ - if ( kTextEncodingUnknown == textEncodingHint ) - { - ScriptCode script; - RegionCode region; - - script = GetScriptManagerVariable(smSysScript); - region = GetScriptManagerVariable(smRegionCode); - result = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, region, - NULL, &textEncodingHint); - if ( paramErr == result ) - { - /* ok, ignore the region and try again */ - result = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, - kTextRegionDontCare, NULL, &textEncodingHint); - } - if ( noErr != result ) - { - /* ok... try something */ - textEncodingHint = kTextEncodingMacRoman; - } - } - - uMapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0, - kUnicodeCanonicalDecompVariant, kUnicode16BitFormat); - uMapping.otherEncoding = GetTextEncodingBase(textEncodingHint); - uMapping.mappingVersion = kUnicodeUseHFSPlusMapping; - - result = CreateTextToUnicodeInfo(&uMapping, &tuInfo); - require_noerr(result, CreateTextToUnicodeInfo); - - result = ConvertFromTextToUnicode(tuInfo, hfsName[0], &hfsName[1], - 0, /* no control flag bits */ - 0, NULL, 0, NULL, /* offsetCounts & offsetArrays */ - sizeof(unicodeName->unicode), /* output buffer size in bytes */ - &pascalCharsRead, &unicodeByteLength, unicodeName->unicode); - require_noerr(result, ConvertFromTextToUnicode); - - /* convert from byte count to char count */ - unicodeName->length = unicodeByteLength / sizeof(UniChar); - -ConvertFromTextToUnicode: - - /* verify the result in debug builds -- there's really not anything you can do if it fails */ - verify_noerr(DisposeTextToUnicodeInfo(&tuInfo)); - } - -CreateTextToUnicodeInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- File/Directory Manipulation Routines ----- - -/*****************************************************************************/ - -Boolean FSRefValid(const FSRef *ref) -{ - return ( noErr == FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, NULL, NULL, NULL) ); -} - -/*****************************************************************************/ - -OSErr -FSGetParentRef( - const FSRef *ref, - FSRef *parentRef) -{ - OSErr result; - FSCatalogInfo catalogInfo; - - /* check parameters */ - require_action(NULL != parentRef, BadParameter, result = paramErr); - - result = FSGetCatalogInfo(ref, kFSCatInfoNodeID, &catalogInfo, NULL, NULL, parentRef); - require_noerr(result, FSGetCatalogInfo); - - /* - * Note: FSRefs always point to real file system objects. So, there cannot - * be a FSRef to the parent of volume root directories. Early versions of - * Mac OS X do not handle this case correctly and incorrectly return a - * FSRef for the parent of volume root directories instead of returning an - * invalid FSRef (a cleared FSRef is invalid). The next three lines of code - * ensure that you won't run into this bug. WW9D! - */ - if ( fsRtDirID == catalogInfo.nodeID ) - { - /* clear parentRef and return noErr which is the proper behavior */ - memset(parentRef, 0, sizeof(FSRef)); - } - -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetFileDirName( - const FSRef *ref, - HFSUniStr255 *outName) -{ - OSErr result; - - /* check parameters */ - require_action(NULL != outName, BadParameter, result = paramErr); - - result = FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, outName, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetNodeID( - const FSRef *ref, - long *nodeID, /* can be NULL */ - Boolean *isDirectory) /* can be NULL */ -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSCatalogInfoBitmap whichInfo; - - /* determine what catalog information to get */ - whichInfo = kFSCatInfoNone; /* start with none */ - if ( NULL != nodeID ) - { - whichInfo |= kFSCatInfoNodeID; - } - if ( NULL != isDirectory ) - { - whichInfo |= kFSCatInfoNodeFlags; - } - - result = FSGetCatalogInfo(ref, whichInfo, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - if ( NULL != nodeID ) - { - *nodeID = catalogInfo.nodeID; - } - if ( NULL != isDirectory ) - { - *isDirectory = (0 != (kFSNodeIsDirectoryMask & catalogInfo.nodeFlags)); - } - -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetUserPrivilegesPermissions( - const FSRef *ref, - UInt8 *userPrivileges, /* can be NULL */ - UInt32 permissions[4]) /* can be NULL */ -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSCatalogInfoBitmap whichInfo; - - /* determine what catalog information to get */ - whichInfo = kFSCatInfoNone; /* start with none */ - if ( NULL != userPrivileges ) - { - whichInfo |= kFSCatInfoUserPrivs; - } - if ( NULL != permissions ) - { - whichInfo |= kFSCatInfoPermissions; - } - - result = FSGetCatalogInfo(ref, whichInfo, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - if ( NULL != userPrivileges ) - { - *userPrivileges = catalogInfo.userPrivileges; - } - if ( NULL != permissions ) - { - BlockMoveData(&catalogInfo.permissions, permissions, sizeof(UInt32) * 4); - } - -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSCheckLock( - const FSRef *ref) -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSVolumeInfo volumeInfo; - - /* get nodeFlags and vRefNum for container */ - result = FSGetCatalogInfo(ref, kFSCatInfoNodeFlags + kFSCatInfoVolume, &catalogInfo, NULL, NULL,NULL); - require_noerr(result, FSGetCatalogInfo); - - /* is file locked? */ - if ( 0 != (catalogInfo.nodeFlags & kFSNodeLockedMask) ) - { - result = fLckdErr; /* file is locked */ - } - else - { - /* file isn't locked, but is volume locked? */ - - /* get volume flags */ - result = FSGetVolumeInfo(catalogInfo.volume, 0, NULL, kFSVolInfoFlags, &volumeInfo, NULL, NULL); - require_noerr(result, FSGetVolumeInfo); - - if ( 0 != (volumeInfo.flags & kFSVolFlagHardwareLockedMask) ) - { - result = wPrErr; /* volume locked by hardware */ - } - else if ( 0 != (volumeInfo.flags & kFSVolFlagSoftwareLockedMask) ) - { - result = vLckdErr; /* volume locked by software */ - } - } - -FSGetVolumeInfo: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetForkSizes( - const FSRef *ref, - UInt64 *dataLogicalSize, /* can be NULL */ - UInt64 *rsrcLogicalSize) /* can be NULL */ -{ - OSErr result; - FSCatalogInfoBitmap whichInfo; - FSCatalogInfo catalogInfo; - - whichInfo = kFSCatInfoNodeFlags; - if ( NULL != dataLogicalSize ) - { - /* get data fork size */ - whichInfo |= kFSCatInfoDataSizes; - } - if ( NULL != rsrcLogicalSize ) - { - /* get resource fork size */ - whichInfo |= kFSCatInfoRsrcSizes; - } - - /* get nodeFlags and catalog info */ - result = FSGetCatalogInfo(ref, whichInfo, &catalogInfo, NULL, NULL,NULL); - require_noerr(result, FSGetCatalogInfo); - - /* make sure FSRef was to a file */ - require_action(0 == (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask), FSRefNotFile, result = notAFileErr); - - if ( NULL != dataLogicalSize ) - { - /* return data fork size */ - *dataLogicalSize = catalogInfo.dataLogicalSize; - } - if ( NULL != rsrcLogicalSize ) - { - /* return resource fork size */ - *rsrcLogicalSize = catalogInfo.rsrcLogicalSize; - } - -FSRefNotFile: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetTotalForkSizes( - const FSRef *ref, - UInt64 *totalLogicalSize, /* can be NULL */ - UInt64 *totalPhysicalSize, /* can be NULL */ - ItemCount *forkCount) /* can be NULL */ -{ - OSErr result; - CatPositionRec forkIterator; - SInt64 forkSize; - SInt64 *forkSizePtr; - UInt64 forkPhysicalSize; - UInt64 *forkPhysicalSizePtr; - - /* Determine if forkSize needed */ - if ( NULL != totalLogicalSize) - { - *totalLogicalSize = 0; - forkSizePtr = &forkSize; - } - else - { - forkSizePtr = NULL; - } - - /* Determine if forkPhysicalSize is needed */ - if ( NULL != totalPhysicalSize ) - { - *totalPhysicalSize = 0; - forkPhysicalSizePtr = &forkPhysicalSize; - } - else - { - forkPhysicalSizePtr = NULL; - } - - /* zero fork count if returning it */ - if ( NULL != forkCount ) - { - *forkCount = 0; - } - - /* Iterate through the forks to get the sizes */ - forkIterator.initialize = 0; - do - { - result = FSIterateForks(ref, &forkIterator, NULL, forkSizePtr, forkPhysicalSizePtr); - if ( noErr == result ) - { - if ( NULL != totalLogicalSize ) - { - *totalLogicalSize += forkSize; - } - - if ( NULL != totalPhysicalSize ) - { - *totalPhysicalSize += forkPhysicalSize; - } - - if ( NULL != forkCount ) - { - ++*forkCount; - } - } - } while ( noErr == result ); - - /* any error result other than errFSNoMoreItems is serious */ - require(errFSNoMoreItems == result, FSIterateForks); - - /* Normal exit */ - result = noErr; - -FSIterateForks: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSBumpDate( - const FSRef *ref) -{ - OSStatus result; - FSCatalogInfo catalogInfo; - UTCDateTime oldDateTime; -#if !BuildingMoreFilesXForMacOS9 - FSRef parentRef; - Boolean notifyParent; -#endif - -#if !BuildingMoreFilesXForMacOS9 - /* Get the node flags, the content modification date and time, and the parent ref */ - result = FSGetCatalogInfo(ref, kFSCatInfoNodeFlags + kFSCatInfoContentMod, &catalogInfo, NULL, NULL, &parentRef); - require_noerr(result, FSGetCatalogInfo); - - /* Notify the parent if this is a file */ - notifyParent = (0 == (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)); -#else - /* Get the content modification date and time */ - result = FSGetCatalogInfo(ref, kFSCatInfoContentMod, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); -#endif - - oldDateTime = catalogInfo.contentModDate; - - /* Get the current date and time */ - result = GetUTCDateTime(&catalogInfo.contentModDate, kUTCDefaultOptions); - require_noerr(result, GetUTCDateTime); - - /* if the old date and time is the the same as the current, bump the seconds by one */ - if ( (catalogInfo.contentModDate.fraction == oldDateTime.fraction) && - (catalogInfo.contentModDate.lowSeconds == oldDateTime.lowSeconds) && - (catalogInfo.contentModDate.highSeconds == oldDateTime.highSeconds) ) - { - ++catalogInfo.contentModDate.lowSeconds; - if ( 0 == catalogInfo.contentModDate.lowSeconds ) - { - ++catalogInfo.contentModDate.highSeconds; - } - } - - /* Bump the content modification date and time */ - result = FSSetCatalogInfo(ref, kFSCatInfoContentMod, &catalogInfo); - require_noerr(result, FSSetCatalogInfo); - -#if !BuildingMoreFilesXForMacOS9 - /* - * The problem with FNNotify is that it is not available under Mac OS 9 - * and there's no way to test for that except for looking for the symbol - * or something. So, I'll just conditionalize this for those who care - * to send a notification. - */ - - /* Send a notification for the parent of the file, or for the directory */ - result = FNNotify(notifyParent ? &parentRef : ref, kFNDirectoryModifiedMessage, kNilOptions); - require_noerr(result, FNNotify); -#endif - - /* ignore errors from FSSetCatalogInfo (volume might be write protected) and FNNotify */ -FNNotify: -FSSetCatalogInfo: - - return ( noErr ); - - /**********************/ - -GetUTCDateTime: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetFinderInfo( - const FSRef *ref, - FinderInfo *info, /* can be NULL */ - ExtendedFinderInfo *extendedInfo, /* can be NULL */ - Boolean *isDirectory) /* can be NULL */ -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSCatalogInfoBitmap whichInfo; - - /* determine what catalog information is really needed */ - whichInfo = kFSCatInfoNone; - - if ( NULL != info ) - { - /* get FinderInfo */ - whichInfo |= kFSCatInfoFinderInfo; - } - - if ( NULL != extendedInfo ) - { - /* get ExtendedFinderInfo */ - whichInfo |= kFSCatInfoFinderXInfo; - } - - if ( NULL != isDirectory ) - { - whichInfo |= kFSCatInfoNodeFlags; - } - - result = FSGetCatalogInfo(ref, whichInfo, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* return FinderInfo if requested */ - if ( NULL != info ) - { - BlockMoveData(catalogInfo.finderInfo, info, sizeof(FinderInfo)); - } - - /* return ExtendedFinderInfo if requested */ - if ( NULL != extendedInfo) - { - BlockMoveData(catalogInfo.extFinderInfo, extendedInfo, sizeof(ExtendedFinderInfo)); - } - - /* set isDirectory Boolean if requested */ - if ( NULL != isDirectory) - { - *isDirectory = (0 != (kFSNodeIsDirectoryMask & catalogInfo.nodeFlags)); - } - -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSSetFinderInfo( - const FSRef *ref, - const FinderInfo *info, - const ExtendedFinderInfo *extendedInfo) -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSCatalogInfoBitmap whichInfo; - - /* determine what catalog information will be set */ - whichInfo = kFSCatInfoNone; /* start with none */ - if ( NULL != info ) - { - /* set FinderInfo */ - whichInfo |= kFSCatInfoFinderInfo; - BlockMoveData(info, catalogInfo.finderInfo, sizeof(FinderInfo)); - } - if ( NULL != extendedInfo ) - { - /* set ExtendedFinderInfo */ - whichInfo |= kFSCatInfoFinderXInfo; - BlockMoveData(extendedInfo, catalogInfo.extFinderInfo, sizeof(ExtendedFinderInfo)); - } - - result = FSSetCatalogInfo(ref, whichInfo, &catalogInfo); - require_noerr(result, FSGetCatalogInfo); - -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSChangeCreatorType( - const FSRef *ref, - OSType fileCreator, - OSType fileType) -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSRef parentRef; - - /* get nodeFlags, finder info, and parent FSRef */ - result = FSGetCatalogInfo(ref, kFSCatInfoNodeFlags + kFSCatInfoFinderInfo, &catalogInfo , NULL, NULL, &parentRef); - require_noerr(result, FSGetCatalogInfo); - - /* make sure FSRef was to a file */ - require_action(0 == (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask), FSRefNotFile, result = notAFileErr); - - /* If fileType not 0x00000000, change fileType */ - if ( fileType != (OSType)0x00000000 ) - { - ((FileInfo *)&catalogInfo.finderInfo)->fileType = fileType; - } - - /* If creator not 0x00000000, change creator */ - if ( fileCreator != (OSType)0x00000000 ) - { - ((FileInfo *)&catalogInfo.finderInfo)->fileCreator = fileCreator; - } - - /* now, save the new information back to disk */ - result = FSSetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo); - require_noerr(result, FSSetCatalogInfo); - - /* and attempt to bump the parent directory's mod date to wake up */ - /* the Finder to the change we just made (ignore errors from this) */ - verify_noerr(FSBumpDate(&parentRef)); - -FSSetCatalogInfo: -FSRefNotFile: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSChangeFinderFlags( - const FSRef *ref, - Boolean setBits, - UInt16 flagBits) -{ - OSErr result; - FSCatalogInfo catalogInfo; - FSRef parentRef; - - /* get the current finderInfo */ - result = FSGetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, &parentRef); - require_noerr(result, FSGetCatalogInfo); - - /* set or clear the appropriate bits in the finderInfo.finderFlags */ - if ( setBits ) - { - /* OR in the bits */ - ((FileInfo *)&catalogInfo.finderInfo)->finderFlags |= flagBits; - } - else - { - /* AND out the bits */ - ((FileInfo *)&catalogInfo.finderInfo)->finderFlags &= ~flagBits; - } - - /* save the modified finderInfo */ - result = FSSetCatalogInfo(ref, kFSCatInfoFinderInfo, &catalogInfo); - require_noerr(result, FSSetCatalogInfo); - - /* and attempt to bump the parent directory's mod date to wake up the Finder */ - /* to the change we just made (ignore errors from this) */ - verify_noerr(FSBumpDate(&parentRef)); - -FSSetCatalogInfo: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSSetInvisible( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, true, kIsInvisible) ); -} - -OSErr -FSClearInvisible( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, false, kIsInvisible) ); -} - -/*****************************************************************************/ - -OSErr -FSSetNameLocked( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, true, kNameLocked) ); -} - -OSErr -FSClearNameLocked( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, false, kNameLocked) ); -} - -/*****************************************************************************/ - -OSErr -FSSetIsStationery( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, true, kIsStationery) ); -} - -OSErr -FSClearIsStationery( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, false, kIsStationery) ); -} - -/*****************************************************************************/ - -OSErr -FSSetHasCustomIcon( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, true, kHasCustomIcon) ); -} - -OSErr -FSClearHasCustomIcon( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, false, kHasCustomIcon) ); -} - -/*****************************************************************************/ - -OSErr -FSClearHasBeenInited( - const FSRef *ref) -{ - return ( FSChangeFinderFlags(ref, false, kHasBeenInited) ); -} - -/*****************************************************************************/ - -OSErr -FSCopyFileMgrAttributes( - const FSRef *sourceRef, - const FSRef *destinationRef, - Boolean copyLockBit) -{ - OSErr result; - FSCatalogInfo catalogInfo; - - /* get the source information */ - result = FSGetCatalogInfo(sourceRef, kFSCatInfoSettableInfo, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* don't copy the hasBeenInited bit; clear it */ - ((FileInfo *)&catalogInfo.finderInfo)->finderFlags &= ~kHasBeenInited; - - /* should the locked bit be copied? */ - if ( !copyLockBit ) - { - /* no, make sure the locked bit is clear */ - catalogInfo.nodeFlags &= ~kFSNodeLockedMask; - } - - /* set the destination information */ - result = FSSetCatalogInfo(destinationRef, kFSCatInfoSettableInfo, &catalogInfo); - require_noerr(result, FSSetCatalogInfo); - -FSSetCatalogInfo: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSMoveRenameObjectUnicode( - const FSRef *ref, - const FSRef *destDirectory, - UniCharCount nameLength, - const UniChar *name, /* can be NULL (no rename during move) */ - TextEncoding textEncodingHint, - FSRef *newRef) /* if function fails along the way, newRef is final location of file */ -{ - OSErr result; - FSVolumeRefNum vRefNum; - FSCatalogInfo catalogInfo; - FSRef originalDirectory; - TextEncoding originalTextEncodingHint; - HFSUniStr255 originalName; - HFSUniStr255 uniqueName; /* unique name given to object while moving it to destination */ - long theSeed; /* the seed for generating unique names */ - - /* check parameters */ - require_action(NULL != newRef, BadParameter, result = paramErr); - - /* newRef = input to start with */ - BlockMoveData(ref, newRef, sizeof(FSRef)); - - /* get destDirectory's vRefNum */ - result = FSGetCatalogInfo(destDirectory, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL); - require_noerr(result, DestinationBad); - - /* save vRefNum */ - vRefNum = catalogInfo.volume; - - /* get ref's vRefNum, TextEncoding, name and parent directory*/ - result = FSGetCatalogInfo(ref, kFSCatInfoTextEncoding + kFSCatInfoVolume, &catalogInfo, &originalName, NULL, &originalDirectory); - require_noerr(result, SourceBad); - - /* save TextEncoding */ - originalTextEncodingHint = catalogInfo.textEncodingHint; - - /* make sure ref and destDirectory are on same volume */ - require_action(vRefNum == catalogInfo.volume, NotSameVolume, result = diffVolErr); - - /* Skip a few steps if we're not renaming */ - if ( NULL != name ) - { - /* generate a name that is unique in both directories */ - theSeed = 0x4a696d4c; /* a fine unlikely filename */ - - result = GenerateUniqueHFSUniStr(&theSeed, &originalDirectory, destDirectory, &uniqueName); - require_noerr(result, GenerateUniqueHFSUniStrFailed); - - /* Rename the object to uniqueName */ - result = FSRenameUnicode(ref, uniqueName.length, uniqueName.unicode, kTextEncodingUnknown, newRef); - require_noerr(result, FSRenameUnicodeBeforeMoveFailed); - - /* Move object to its new home */ - result = FSMoveObject(newRef, destDirectory, newRef); - require_noerr(result, FSMoveObjectAfterRenameFailed); - - /* Rename the object to new name */ - result = FSRenameUnicode(ref, nameLength, name, textEncodingHint, newRef); - require_noerr(result, FSRenameUnicodeAfterMoveFailed); - } - else - { - /* Move object to its new home */ - result = FSMoveObject(newRef, destDirectory, newRef); - require_noerr(result, FSMoveObjectNoRenameFailed); - } - - return ( result ); - - /*************/ - -/* - * failure handling code when renaming - */ - -FSRenameUnicodeAfterMoveFailed: - - /* Error handling: move object back to original location - ignore errors */ - verify_noerr(FSMoveObject(newRef, &originalDirectory, newRef)); - -FSMoveObjectAfterRenameFailed: - - /* Error handling: rename object back to original name - ignore errors */ - verify_noerr(FSRenameUnicode(newRef, originalName.length, originalName.unicode, originalTextEncodingHint, newRef)); - -FSRenameUnicodeBeforeMoveFailed: -GenerateUniqueHFSUniStrFailed: - -/* - * failure handling code for renaming or not - */ -FSMoveObjectNoRenameFailed: -NotSameVolume: -SourceBad: -DestinationBad: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -/* - The FSDeleteContainerLevel function deletes the contents of a container - directory. All files and subdirectories in the specified container are - deleted. If a locked file or directory is encountered, it is unlocked - and then deleted. If any unexpected errors are encountered, - FSDeleteContainerLevel quits and returns to the caller. - - container --> FSRef to a directory. - theGlobals --> A pointer to a FSDeleteContainerGlobals struct - which contains the variables that do not need to - be allocated each time FSDeleteContainerLevel - recurses. That lets FSDeleteContainerLevel use - less stack space per recursion level. -*/ - -static -void -FSDeleteContainerLevel( - const FSRef *container, - FSDeleteContainerGlobals *theGlobals) -{ - /* level locals */ - FSIterator iterator; - FSRef itemToDelete; - UInt16 nodeFlags; - - /* Open FSIterator for flat access and give delete optimization hint */ - theGlobals->result = FSOpenIterator(container, kFSIterateFlat + kFSIterateDelete, &iterator); - require_noerr(theGlobals->result, FSOpenIterator); - - /* delete the contents of the directory */ - do - { - /* get 1 item to delete */ - theGlobals->result = FSGetCatalogInfoBulk(iterator, 1, &theGlobals->actualObjects, - NULL, kFSCatInfoNodeFlags, &theGlobals->catalogInfo, - &itemToDelete, NULL, NULL); - if ( (noErr == theGlobals->result) && (1 == theGlobals->actualObjects) ) - { - /* save node flags in local in case we have to recurse */ - nodeFlags = theGlobals->catalogInfo.nodeFlags; - - /* is it a file or directory? */ - if ( 0 != (nodeFlags & kFSNodeIsDirectoryMask) ) - { - /* it's a directory -- delete its contents before attempting to delete it */ - FSDeleteContainerLevel(&itemToDelete, theGlobals); - } - /* are we still OK to delete? */ - if ( noErr == theGlobals->result ) - { - /* is item locked? */ - if ( 0 != (nodeFlags & kFSNodeLockedMask) ) - { - /* then attempt to unlock it (ignore result since FSDeleteObject will set it correctly) */ - theGlobals->catalogInfo.nodeFlags = nodeFlags & ~kFSNodeLockedMask; - (void) FSSetCatalogInfo(&itemToDelete, kFSCatInfoNodeFlags, &theGlobals->catalogInfo); - } - /* delete the item */ - theGlobals->result = FSDeleteObject(&itemToDelete); - } - } - } while ( noErr == theGlobals->result ); - - /* we found the end of the items normally, so return noErr */ - if ( errFSNoMoreItems == theGlobals->result ) - { - theGlobals->result = noErr; - } - - /* close the FSIterator (closing an open iterator should never fail) */ - verify_noerr(FSCloseIterator(iterator)); - -FSOpenIterator: - - return; -} - -/*****************************************************************************/ - -OSErr -FSDeleteContainerContents( - const FSRef *container) -{ - FSDeleteContainerGlobals theGlobals; - - /* delete container's contents */ - FSDeleteContainerLevel(container, &theGlobals); - - return ( theGlobals.result ); -} - -/*****************************************************************************/ - -OSErr -FSDeleteContainer( - const FSRef *container) -{ - OSErr result; - FSCatalogInfo catalogInfo; - - /* get nodeFlags for container */ - result = FSGetCatalogInfo(container, kFSCatInfoNodeFlags, &catalogInfo, NULL, NULL,NULL); - require_noerr(result, FSGetCatalogInfo); - - /* make sure container is a directory */ - require_action(0 != (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask), ContainerNotDirectory, result = dirNFErr); - - /* delete container's contents */ - result = FSDeleteContainerContents(container); - require_noerr(result, FSDeleteContainerContents); - - /* is container locked? */ - if ( 0 != (catalogInfo.nodeFlags & kFSNodeLockedMask) ) - { - /* then attempt to unlock container (ignore result since FSDeleteObject will set it correctly) */ - catalogInfo.nodeFlags &= ~kFSNodeLockedMask; - (void) FSSetCatalogInfo(container, kFSCatInfoNodeFlags, &catalogInfo); - } - - /* delete the container */ - result = FSDeleteObject(container); - -FSDeleteContainerContents: -ContainerNotDirectory: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -/* - The FSIterateContainerLevel function iterates the contents of a container - directory and calls a IterateContainerFilterProc function once for each - file and directory found. - - theGlobals --> A pointer to a FSIterateContainerGlobals struct - which contains the variables needed globally by - all recusion levels of FSIterateContainerLevel. - That makes FSIterateContainer thread safe since - each call to it uses its own global world. - It also contains the variables that do not need - to be allocated each time FSIterateContainerLevel - recurses. That lets FSIterateContainerLevel use - less stack space per recursion level. -*/ - -static -void -FSIterateContainerLevel( - FSIterateContainerGlobals *theGlobals) -{ - FSIterator iterator; - - /* If maxLevels is zero, we aren't checking levels */ - /* If currentLevel < maxLevels, look at this level */ - if ( (theGlobals->maxLevels == 0) || - (theGlobals->currentLevel < theGlobals->maxLevels) ) - { - /* Open FSIterator for flat access to theGlobals->ref */ - theGlobals->result = FSOpenIterator(&theGlobals->ref, kFSIterateFlat, &iterator); - require_noerr(theGlobals->result, FSOpenIterator); - - ++theGlobals->currentLevel; /* Go to next level */ - - /* Call FSGetCatalogInfoBulk in loop to get all items in the container */ - do - { - theGlobals->result = FSGetCatalogInfoBulk(iterator, 1, &theGlobals->actualObjects, - &theGlobals->containerChanged, theGlobals->whichInfo, &theGlobals->catalogInfo, - &theGlobals->ref, theGlobals->specPtr, theGlobals->namePtr); - if ( (noErr == theGlobals->result || errFSNoMoreItems == theGlobals->result) && - (0 != theGlobals->actualObjects) ) - { - /* Call the IterateFilterProc */ - theGlobals->quitFlag = CallIterateContainerFilterProc(theGlobals->iterateFilter, - theGlobals->containerChanged, theGlobals->currentLevel, - &theGlobals->catalogInfo, &theGlobals->ref, - theGlobals->specPtr, theGlobals->namePtr, theGlobals->yourDataPtr); - /* Is it a directory? */ - if ( 0 != (theGlobals->catalogInfo.nodeFlags & kFSNodeIsDirectoryMask) ) - { - /* Keep going? */ - if ( !theGlobals->quitFlag ) - { - /* Dive again if the IterateFilterProc didn't say "quit" */ - FSIterateContainerLevel(theGlobals); - } - } - } - /* time to fall back a level? */ - } while ( (noErr == theGlobals->result) && (!theGlobals->quitFlag) ); - - /* errFSNoMoreItems is OK - it only means we hit the end of this level */ - /* afpAccessDenied is OK, too - it only means we cannot see inside a directory */ - if ( (errFSNoMoreItems == theGlobals->result) || - (afpAccessDenied == theGlobals->result) ) - { - theGlobals->result = noErr; - } - - --theGlobals->currentLevel; /* Return to previous level as we leave */ - - /* Close the FSIterator (closing an open iterator should never fail) */ - verify_noerr(FSCloseIterator(iterator)); - } - -FSOpenIterator: - - return; -} - -/*****************************************************************************/ - -OSErr -FSIterateContainer( - const FSRef *container, - ItemCount maxLevels, - FSCatalogInfoBitmap whichInfo, - Boolean wantFSSpec, - Boolean wantName, - IterateContainerFilterProcPtr iterateFilter, - void *yourDataPtr) -{ - OSErr result; - FSIterateContainerGlobals theGlobals; - - /* make sure there is an iterateFilter */ - require_action(iterateFilter != NULL, NoIterateFilter, result = paramErr); - - /* - * set up the globals we need to access from the recursive routine - */ - theGlobals.iterateFilter = iterateFilter; - /* we need the node flags no matter what was requested so we can detect files vs. directories */ - theGlobals.whichInfo = whichInfo | kFSCatInfoNodeFlags; - /* start with input container -- the first OpenIterator will ensure it is a directory */ - theGlobals.ref = *container; - if ( wantFSSpec ) - { - theGlobals.specPtr = &theGlobals.spec; - } - else - { - theGlobals.specPtr = NULL; - } - if ( wantName ) - { - theGlobals.namePtr = &theGlobals.name; - } - else - { - theGlobals.namePtr = NULL; - } - theGlobals.yourDataPtr = yourDataPtr; - theGlobals.maxLevels = maxLevels; - theGlobals.currentLevel = 0; - theGlobals.quitFlag = false; - theGlobals.containerChanged = false; - theGlobals.result = noErr; - theGlobals.actualObjects = 0; - - /* here we go into recursion land... */ - FSIterateContainerLevel(&theGlobals); - result = theGlobals.result; - require_noerr(result, FSIterateContainerLevel); - -FSIterateContainerLevel: -NoIterateFilter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetDirectoryItems( - const FSRef *container, - FSRef ***refsHandle, /* pointer to handle of FSRefs */ - ItemCount *numRefs, - Boolean *containerChanged) -{ - /* Grab items 10 at a time. */ - enum { kMaxItemsPerBulkCall = 10 }; - - OSErr result; - OSErr memResult; - FSIterator iterator; - FSRef refs[kMaxItemsPerBulkCall]; - ItemCount actualObjects; - Boolean changed; - - /* check parameters */ - require_action((NULL != refsHandle) && (NULL != numRefs) && (NULL != containerChanged), - BadParameter, result = paramErr); - - *numRefs = 0; - *containerChanged = false; - *refsHandle = (FSRef **)NewHandle(0); - require_action(NULL != *refsHandle, NewHandle, result = memFullErr); - - /* open an FSIterator */ - result = FSOpenIterator(container, kFSIterateFlat, &iterator); - require_noerr(result, FSOpenIterator); - - /* Call FSGetCatalogInfoBulk in loop to get all items in the container */ - do - { - result = FSGetCatalogInfoBulk(iterator, kMaxItemsPerBulkCall, &actualObjects, - &changed, kFSCatInfoNone, NULL, refs, NULL, NULL); - - /* if the container changed, set containerChanged for output, but keep going */ - if ( changed ) - { - *containerChanged = changed; - } - - /* any result other than noErr and errFSNoMoreItems is serious */ - require((noErr == result) || (errFSNoMoreItems == result), FSGetCatalogInfoBulk); - - /* add objects to output array and count */ - if ( 0 != actualObjects ) - { - /* concatenate the FSRefs to the end of the handle */ - PtrAndHand(refs, (Handle)*refsHandle, actualObjects * sizeof(FSRef)); - memResult = MemError(); - require_noerr_action(memResult, MemoryAllocationFailed, result = memResult); - - *numRefs += actualObjects; - } - } while ( noErr == result ); - - verify_noerr(FSCloseIterator(iterator)); /* closing an open iterator should never fail, but... */ - - return ( noErr ); - - /**********************/ - -MemoryAllocationFailed: -FSGetCatalogInfoBulk: - - /* close the iterator */ - verify_noerr(FSCloseIterator(iterator)); - -FSOpenIterator: - /* dispose of handle if already allocated and clear the outputs */ - if ( NULL != *refsHandle ) - { - DisposeHandle((Handle)*refsHandle); - *refsHandle = NULL; - } - *numRefs = 0; - -NewHandle: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -/* - The GenerateUniqueName function generates a HFSUniStr255 name that is - unique in both dir1 and dir2. - - startSeed --> A pointer to a long which is used to generate the - unique name. - <-- It is modified on output to a value which should - be used to generate the next unique name. - dir1 --> The first directory. - dir2 --> The second directory. - uniqueName <-- A pointer to a HFSUniStr255 where the unique name - is to be returned. -*/ - -static -OSErr -GenerateUniqueHFSUniStr( - long *startSeed, - const FSRef *dir1, - const FSRef *dir2, - HFSUniStr255 *uniqueName) -{ - OSErr result; - long i; - FSRefParam pb; - FSRef newRef; - unsigned char hexStr[17] = "0123456789ABCDEF"; - - /* set up the parameter block */ - pb.name = uniqueName->unicode; - pb.nameLength = 8; /* always 8 characters */ - pb.textEncodingHint = kTextEncodingUnknown; - pb.newRef = &newRef; - - /* loop until we get fnfErr with a filename in both directories */ - result = noErr; - while ( fnfErr != result ) - { - /* convert startSeed to 8 character Unicode string */ - uniqueName->length = 8; - for ( i = 0; i < 8; ++i ) - { - uniqueName->unicode[i] = hexStr[((*startSeed >> ((7-i)*4)) & 0xf)]; - } - - /* try in dir1 */ - pb.ref = dir1; - result = PBMakeFSRefUnicodeSync(&pb); - if ( fnfErr == result ) - { - /* try in dir2 */ - pb.ref = dir2; - result = PBMakeFSRefUnicodeSync(&pb); - if ( fnfErr != result ) - { - /* exit if anything other than noErr or fnfErr */ - require_noerr(result, Dir2PBMakeFSRefUnicodeSyncFailed); - } - } - else - { - /* exit if anything other than noErr or fnfErr */ - require_noerr(result, Dir1PBMakeFSRefUnicodeSyncFailed); - } - - /* increment seed for next pass through loop, */ - /* or for next call to GenerateUniqueHFSUniStr */ - ++(*startSeed); - } - - /* we have a unique file name which doesn't exist in dir1 or dir2 */ - result = noErr; - -Dir2PBMakeFSRefUnicodeSyncFailed: -Dir1PBMakeFSRefUnicodeSyncFailed: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSExchangeObjectsCompat( - const FSRef *sourceRef, - const FSRef *destRef, - FSRef *newSourceRef, - FSRef *newDestRef) -{ - enum - { - /* get all settable info except for mod dates, plus the volume refNum and parent directory ID */ - kGetCatInformationMask = (kFSCatInfoSettableInfo | - kFSCatInfoVolume | - kFSCatInfoParentDirID) & - ~(kFSCatInfoContentMod | kFSCatInfoAttrMod), - /* set everything possible except for mod dates */ - kSetCatinformationMask = kFSCatInfoSettableInfo & - ~(kFSCatInfoContentMod | kFSCatInfoAttrMod) - }; - - OSErr result; - GetVolParmsInfoBuffer volParmsInfo; - UInt32 infoSize; - FSCatalogInfo sourceCatalogInfo; /* source file's catalog information */ - FSCatalogInfo destCatalogInfo; /* destination file's catalog information */ - HFSUniStr255 sourceName; /* source file's Unicode name */ - HFSUniStr255 destName; /* destination file's Unicode name */ - FSRef sourceCurrentRef; /* FSRef to current location of source file throughout this function */ - FSRef destCurrentRef; /* FSRef to current location of destination file throughout this function */ - FSRef sourceParentRef; /* FSRef to parent directory of source file */ - FSRef destParentRef; /* FSRef to parent directory of destination file */ - HFSUniStr255 sourceUniqueName; /* unique name given to source file while exchanging it with destination */ - HFSUniStr255 destUniqueName; /* unique name given to destination file while exchanging it with source */ - long theSeed; /* the seed for generating unique names */ - Boolean sameParentDirs; /* true if source and destinatin parent directory is the same */ - - /* check parameters */ - require_action((NULL != newSourceRef) && (NULL != newDestRef), BadParameter, result = paramErr); - - /* output refs and current refs = input refs to start with */ - BlockMoveData(sourceRef, newSourceRef, sizeof(FSRef)); - BlockMoveData(sourceRef, &sourceCurrentRef, sizeof(FSRef)); - - BlockMoveData(destRef, newDestRef, sizeof(FSRef)); - BlockMoveData(destRef, &destCurrentRef, sizeof(FSRef)); - - /* get source volume's vRefNum */ - result = FSGetCatalogInfo(&sourceCurrentRef, kFSCatInfoVolume, &sourceCatalogInfo, NULL, NULL, NULL); - require_noerr(result, DetermineSourceVRefNumFailed); - - /* see if that volume supports FSExchangeObjects */ - result = FSGetVolParms(sourceCatalogInfo.volume, sizeof(GetVolParmsInfoBuffer), - &volParmsInfo, &infoSize); - if ( (noErr == result) && VolSupportsFSExchangeObjects(&volParmsInfo) ) - { - /* yes - use FSExchangeObjects */ - result = FSExchangeObjects(sourceRef, destRef); - } - else - { - /* no - emulate FSExchangeObjects */ - - /* Note: The compatibility case won't work for files with *Btree control blocks. */ - /* Right now the only *Btree files are created by the system. */ - - /* get all catalog information and Unicode names for each file */ - result = FSGetCatalogInfo(&sourceCurrentRef, kGetCatInformationMask, &sourceCatalogInfo, &sourceName, NULL, &sourceParentRef); - require_noerr(result, SourceFSGetCatalogInfoFailed); - - result = FSGetCatalogInfo(&destCurrentRef, kGetCatInformationMask, &destCatalogInfo, &destName, NULL, &destParentRef); - require_noerr(result, DestFSGetCatalogInfoFailed); - - /* make sure source and destination are on same volume */ - require_action(sourceCatalogInfo.volume == destCatalogInfo.volume, NotSameVolume, result = diffVolErr); - - /* make sure both files are *really* files */ - require_action((0 == (sourceCatalogInfo.nodeFlags & kFSNodeIsDirectoryMask)) && - (0 == (destCatalogInfo.nodeFlags & kFSNodeIsDirectoryMask)), NotAFile, result = notAFileErr); - - /* generate 2 names that are unique in both directories */ - theSeed = 0x4a696d4c; /* a fine unlikely filename */ - - result = GenerateUniqueHFSUniStr(&theSeed, &sourceParentRef, &destParentRef, &sourceUniqueName); - require_noerr(result, GenerateUniqueHFSUniStr1Failed); - - result = GenerateUniqueHFSUniStr(&theSeed, &sourceParentRef, &destParentRef, &destUniqueName); - require_noerr(result, GenerateUniqueHFSUniStr2Failed); - - /* rename sourceCurrentRef to sourceUniqueName */ - result = FSRenameUnicode(&sourceCurrentRef, sourceUniqueName.length, sourceUniqueName.unicode, kTextEncodingUnknown, newSourceRef); - require_noerr(result, FSRenameUnicode1Failed); - BlockMoveData(newSourceRef, &sourceCurrentRef, sizeof(FSRef)); - - /* rename destCurrentRef to destUniqueName */ - result = FSRenameUnicode(&destCurrentRef, destUniqueName.length, destUniqueName.unicode, kTextEncodingUnknown, newDestRef); - require_noerr(result, FSRenameUnicode2Failed); - BlockMoveData(newDestRef, &destCurrentRef, sizeof(FSRef)); - - /* are the source and destination parent directories the same? */ - sameParentDirs = ( sourceCatalogInfo.parentDirID == destCatalogInfo.parentDirID ); - if ( !sameParentDirs ) - { - /* move source file to dest parent directory */ - result = FSMoveObject(&sourceCurrentRef, &destParentRef, newSourceRef); - require_noerr(result, FSMoveObject1Failed); - BlockMoveData(newSourceRef, &sourceCurrentRef, sizeof(FSRef)); - - /* move dest file to source parent directory */ - result = FSMoveObject(&destCurrentRef, &sourceParentRef, newDestRef); - require_noerr(result, FSMoveObject2Failed); - BlockMoveData(newDestRef, &destCurrentRef, sizeof(FSRef)); - } - - /* At this point, the files are in their new locations (if they were moved). */ - /* The source file is named sourceUniqueName and is in the directory referred to */ - /* by destParentRef. The destination file is named destUniqueName and is in the */ - /* directory referred to by sourceParentRef. */ - - /* give source file the dest file's catalog information except for mod dates */ - result = FSSetCatalogInfo(&sourceCurrentRef, kSetCatinformationMask, &destCatalogInfo); - require_noerr(result, FSSetCatalogInfo1Failed); - - /* give dest file the source file's catalog information except for mod dates */ - result = FSSetCatalogInfo(&destCurrentRef, kSetCatinformationMask, &sourceCatalogInfo); - require_noerr(result, FSSetCatalogInfo2Failed); - - /* rename source file with dest file's name */ - result = FSRenameUnicode(&sourceCurrentRef, destName.length, destName.unicode, destCatalogInfo.textEncodingHint, newSourceRef); - require_noerr(result, FSRenameUnicode3Failed); - BlockMoveData(newSourceRef, &sourceCurrentRef, sizeof(FSRef)); - - /* rename dest file with source file's name */ - result = FSRenameUnicode(&destCurrentRef, sourceName.length, sourceName.unicode, sourceCatalogInfo.textEncodingHint, newDestRef); - require_noerr(result, FSRenameUnicode4Failed); - - /* we're done with no errors, so swap newSourceRef and newDestRef */ - BlockMoveData(newDestRef, newSourceRef, sizeof(FSRef)); - BlockMoveData(&sourceCurrentRef, newDestRef, sizeof(FSRef)); - } - - return ( result ); - - /**********************/ - -/* If there are any failures while emulating FSExchangeObjects, attempt to reverse any steps */ -/* already taken. In any case, newSourceRef and newDestRef will refer to the files in whatever */ -/* state and location they ended up in so that both files can be found by the calling code. */ - -FSRenameUnicode4Failed: - - /* attempt to rename source file to sourceUniqueName */ - if ( noErr == FSRenameUnicode(&sourceCurrentRef, sourceUniqueName.length, sourceUniqueName.unicode, kTextEncodingUnknown, newSourceRef) ) - { - BlockMoveData(newSourceRef, &sourceCurrentRef, sizeof(FSRef)); - } - -FSRenameUnicode3Failed: - - /* attempt to restore dest file's catalog information */ - verify_noerr(FSSetCatalogInfo(&destCurrentRef, kFSCatInfoSettableInfo, &destCatalogInfo)); - -FSSetCatalogInfo2Failed: - - /* attempt to restore source file's catalog information */ - verify_noerr(FSSetCatalogInfo(&sourceCurrentRef, kFSCatInfoSettableInfo, &sourceCatalogInfo)); - -FSSetCatalogInfo1Failed: - - if ( !sameParentDirs ) - { - /* attempt to move dest file back to dest directory */ - if ( noErr == FSMoveObject(&destCurrentRef, &destParentRef, newDestRef) ) - { - BlockMoveData(newDestRef, &destCurrentRef, sizeof(FSRef)); - } - } - -FSMoveObject2Failed: - - if ( !sameParentDirs ) - { - /* attempt to move source file back to source directory */ - if ( noErr == FSMoveObject(&sourceCurrentRef, &sourceParentRef, newSourceRef) ) - { - BlockMoveData(newSourceRef, &sourceCurrentRef, sizeof(FSRef)); - } - } - -FSMoveObject1Failed: - - /* attempt to rename dest file to original name */ - verify_noerr(FSRenameUnicode(&destCurrentRef, destName.length, destName.unicode, destCatalogInfo.textEncodingHint, newDestRef)); - -FSRenameUnicode2Failed: - - /* attempt to rename source file to original name */ - verify_noerr(FSRenameUnicode(&sourceCurrentRef, sourceName.length, sourceName.unicode, sourceCatalogInfo.textEncodingHint, newSourceRef)); - -FSRenameUnicode1Failed: -GenerateUniqueHFSUniStr2Failed: -GenerateUniqueHFSUniStr1Failed: -NotAFile: -NotSameVolume: -DestFSGetCatalogInfoFailed: -SourceFSGetCatalogInfoFailed: -DetermineSourceVRefNumFailed: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- Shared Environment Routines ----- - -/*****************************************************************************/ - -OSErr -FSLockRange( - SInt16 refNum, - SInt32 rangeLength, - SInt32 rangeStart) -{ - OSErr result; - ParamBlockRec pb; - - pb.ioParam.ioRefNum = refNum; - pb.ioParam.ioReqCount = rangeLength; - pb.ioParam.ioPosMode = fsFromStart; - pb.ioParam.ioPosOffset = rangeStart; - result = PBLockRangeSync(&pb); - require_noerr(result, PBLockRangeSync); - -PBLockRangeSync: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSUnlockRange( - SInt16 refNum, - SInt32 rangeLength, - SInt32 rangeStart) -{ - OSErr result; - ParamBlockRec pb; - - pb.ioParam.ioRefNum = refNum; - pb.ioParam.ioReqCount = rangeLength; - pb.ioParam.ioPosMode = fsFromStart; - pb.ioParam.ioPosOffset = rangeStart; - result = PBUnlockRangeSync(&pb); - require_noerr(result, PBUnlockRangeSync); - -PBUnlockRangeSync: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetDirAccess( - const FSRef *ref, - SInt32 *ownerID, /* can be NULL */ - SInt32 *groupID, /* can be NULL */ - SInt32 *accessRights) /* can be NULL */ -{ - OSErr result; - FSSpec spec; - HParamBlockRec pb; - - /* get FSSpec from FSRef */ - result = FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, NULL, &spec, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* get directory access info for FSSpec */ - pb.accessParam.ioNamePtr = (StringPtr)spec.name; - pb.accessParam.ioVRefNum = spec.vRefNum; - pb.fileParam.ioDirID = spec.parID; - result = PBHGetDirAccessSync(&pb); - require_noerr(result, PBHGetDirAccessSync); - - /* return the IDs and access rights */ - if ( NULL != ownerID ) - { - *ownerID = pb.accessParam.ioACOwnerID; - } - if ( NULL != groupID ) - { - *groupID = pb.accessParam.ioACGroupID; - } - if ( NULL != accessRights ) - { - *accessRights = pb.accessParam.ioACAccess; - } - -PBHGetDirAccessSync: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSSetDirAccess( - const FSRef *ref, - SInt32 ownerID, - SInt32 groupID, - SInt32 accessRights) -{ - OSErr result; - FSSpec spec; - HParamBlockRec pb; - - enum - { - /* Just the bits that can be set */ - kSetDirAccessSettableMask = (kioACAccessBlankAccessMask + - kioACAccessEveryoneWriteMask + kioACAccessEveryoneReadMask + kioACAccessEveryoneSearchMask + - kioACAccessGroupWriteMask + kioACAccessGroupReadMask + kioACAccessGroupSearchMask + - kioACAccessOwnerWriteMask + kioACAccessOwnerReadMask + kioACAccessOwnerSearchMask) - }; - - /* get FSSpec from FSRef */ - result = FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, NULL, &spec, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* set directory access info for FSSpec */ - pb.accessParam.ioNamePtr = (StringPtr)spec.name; - pb.accessParam.ioVRefNum = spec.vRefNum; - pb.fileParam.ioDirID = spec.parID; - pb.accessParam.ioACOwnerID = ownerID; - pb.accessParam.ioACGroupID = groupID; - pb.accessParam.ioACAccess = accessRights & kSetDirAccessSettableMask; - result = PBHSetDirAccessSync(&pb); - require_noerr(result, PBHSetDirAccessSync); - -PBHSetDirAccessSync: -FSGetCatalogInfo: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetVolMountInfoSize( - FSVolumeRefNum volRefNum, - SInt16 *size) -{ - OSErr result; - ParamBlockRec pb; - - /* check parameters */ - require_action(NULL != size, BadParameter, result = paramErr); - - pb.ioParam.ioNamePtr = NULL; - pb.ioParam.ioVRefNum = volRefNum; - pb.ioParam.ioBuffer = (Ptr)size; - result = PBGetVolMountInfoSize(&pb); - require_noerr(result, PBGetVolMountInfoSize); - -PBGetVolMountInfoSize: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSGetVolMountInfo( - FSVolumeRefNum volRefNum, - void *volMountInfo) -{ - OSErr result; - ParamBlockRec pb; - - /* check parameters */ - require_action(NULL != volMountInfo, BadParameter, result = paramErr); - - pb.ioParam.ioNamePtr = NULL; - pb.ioParam.ioVRefNum = volRefNum; - pb.ioParam.ioBuffer = (Ptr)volMountInfo; - result = PBGetVolMountInfo(&pb); - require_noerr(result, PBGetVolMountInfo); - -PBGetVolMountInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSVolumeMount( - const void *volMountInfo, - FSVolumeRefNum *volRefNum) -{ - OSErr result; - ParamBlockRec pb; - - /* check parameters */ - require_action(NULL != volRefNum, BadParameter, result = paramErr); - - pb.ioParam.ioBuffer = (Ptr)volMountInfo; - result = PBVolumeMount(&pb); - require_noerr(result, PBVolumeMount); - - /* return the volume reference number */ - *volRefNum = pb.ioParam.ioVRefNum; - -PBVolumeMount: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSMapID( - FSVolumeRefNum volRefNum, - SInt32 ugID, - SInt16 objType, - Str31 name) -{ - OSErr result; - HParamBlockRec pb; - - /* check parameters */ - require_action(NULL != name, BadParameter, result = paramErr); - - pb.objParam.ioNamePtr = NULL; - pb.objParam.ioVRefNum = volRefNum; - pb.objParam.ioObjType = objType; - pb.objParam.ioObjNamePtr = name; - pb.objParam.ioObjID = ugID; - result = PBHMapIDSync(&pb); - require_noerr(result, PBHMapIDSync); - -PBHMapIDSync: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSMapName( - FSVolumeRefNum volRefNum, - ConstStr255Param name, - SInt16 objType, - SInt32 *ugID) -{ - OSErr result; - HParamBlockRec pb; - - /* check parameters */ - require_action(NULL != ugID, BadParameter, result = paramErr); - - pb.objParam.ioNamePtr = NULL; - pb.objParam.ioVRefNum = volRefNum; - pb.objParam.ioObjType = objType; - pb.objParam.ioObjNamePtr = (StringPtr)name; - result = PBHMapNameSync(&pb); - require_noerr(result, PBHMapNameSync); - - /* return the user or group ID */ - *ugID = pb.objParam.ioObjID; - -PBHMapNameSync: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSCopyFile( - const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - UniCharCount nameLength, - const UniChar *copyName, /* can be NULL (no rename during copy) */ - TextEncoding textEncodingHint, - FSRef *newRef) /* can be NULL */ -{ - OSErr result; - FSSpec srcFileSpec; - FSCatalogInfo catalogInfo; - HParamBlockRec pb; - Str31 hfsName; - GetVolParmsInfoBuffer volParmsInfo; - UInt32 infoSize; - - /* get source FSSpec from source FSRef */ - result = FSGetCatalogInfo(srcFileRef, kFSCatInfoNone, NULL, NULL, &srcFileSpec, NULL); - require_noerr(result, FSGetCatalogInfo_srcFileRef); - - /* Make sure the volume supports CopyFile */ - result = FSGetVolParms(srcFileSpec.vRefNum, sizeof(GetVolParmsInfoBuffer), - &volParmsInfo, &infoSize); - require_action((noErr == result) && VolHasCopyFile(&volParmsInfo), - NoCopyFileSupport, result = paramErr); - - /* get destination volume reference number and destination directory ID from destination FSRef */ - result = FSGetCatalogInfo(dstDirectoryRef, kFSCatInfoVolume + kFSCatInfoNodeID, - &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo_dstDirectoryRef); - - /* tell the server to copy the object */ - pb.copyParam.ioVRefNum = srcFileSpec.vRefNum; - pb.copyParam.ioDirID = srcFileSpec.parID; - pb.copyParam.ioNamePtr = (StringPtr)srcFileSpec.name; - pb.copyParam.ioDstVRefNum = catalogInfo.volume; - pb.copyParam.ioNewDirID = (long)catalogInfo.nodeID; - pb.copyParam.ioNewName = NULL; - if ( NULL != copyName ) - { - result = UnicodeNameGetHFSName(nameLength, copyName, textEncodingHint, false, hfsName); - require_noerr(result, UnicodeNameGetHFSName); - - pb.copyParam.ioCopyName = hfsName; - } - else - { - pb.copyParam.ioCopyName = NULL; - } - result = PBHCopyFileSync(&pb); - require_noerr(result, PBHCopyFileSync); - - if ( NULL != newRef ) - { - verify_noerr(FSMakeFSRef(pb.copyParam.ioDstVRefNum, pb.copyParam.ioNewDirID, - pb.copyParam.ioCopyName, newRef)); - } - -PBHCopyFileSync: -UnicodeNameGetHFSName: -FSGetCatalogInfo_dstDirectoryRef: -NoCopyFileSupport: -FSGetCatalogInfo_srcFileRef: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSMoveRename( - const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - UniCharCount nameLength, - const UniChar *moveName, /* can be NULL (no rename during move) */ - TextEncoding textEncodingHint, - FSRef *newRef) /* can be NULL */ -{ - OSErr result; - FSSpec srcFileSpec; - FSCatalogInfo catalogInfo; - HParamBlockRec pb; - Str31 hfsName; - GetVolParmsInfoBuffer volParmsInfo; - UInt32 infoSize; - - /* get source FSSpec from source FSRef */ - result = FSGetCatalogInfo(srcFileRef, kFSCatInfoNone, NULL, NULL, &srcFileSpec, NULL); - require_noerr(result, FSGetCatalogInfo_srcFileRef); - - /* Make sure the volume supports MoveRename */ - result = FSGetVolParms(srcFileSpec.vRefNum, sizeof(GetVolParmsInfoBuffer), - &volParmsInfo, &infoSize); - require_action((noErr == result) && VolHasMoveRename(&volParmsInfo), - NoMoveRenameSupport, result = paramErr); - - /* get destination volume reference number and destination directory ID from destination FSRef */ - result = FSGetCatalogInfo(dstDirectoryRef, kFSCatInfoVolume + kFSCatInfoNodeID, - &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo_dstDirectoryRef); - - /* make sure the source and destination are on the same volume */ - require_action(srcFileSpec.vRefNum == catalogInfo.volume, NotSameVolume, result = diffVolErr); - - /* tell the server to move and rename the object */ - pb.copyParam.ioVRefNum = srcFileSpec.vRefNum; - pb.copyParam.ioDirID = srcFileSpec.parID; - pb.copyParam.ioNamePtr = (StringPtr)srcFileSpec.name; - pb.copyParam.ioNewDirID = (long)catalogInfo.nodeID; - pb.copyParam.ioNewName = NULL; - if ( NULL != moveName ) - { - result = UnicodeNameGetHFSName(nameLength, moveName, textEncodingHint, false, hfsName); - require_noerr(result, UnicodeNameGetHFSName); - - pb.copyParam.ioCopyName = hfsName; - } - else - { - pb.copyParam.ioCopyName = NULL; - } - result = PBHMoveRenameSync(&pb); - require_noerr(result, PBHMoveRenameSync); - - if ( NULL != newRef ) - { - verify_noerr(FSMakeFSRef(pb.copyParam.ioVRefNum, pb.copyParam.ioNewDirID, - pb.copyParam.ioCopyName, newRef)); - } - -PBHMoveRenameSync: -UnicodeNameGetHFSName: -NotSameVolume: -FSGetCatalogInfo_dstDirectoryRef: -NoMoveRenameSupport: -FSGetCatalogInfo_srcFileRef: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- File ID Routines ----- - -/*****************************************************************************/ - -OSErr -FSResolveFileIDRef( - FSVolumeRefNum volRefNum, - SInt32 fileID, - FSRef *ref) -{ - OSErr result; - FIDParam pb; - Str255 tempStr; - - /* check parameters */ - require_action(NULL != ref, BadParameter, result = paramErr); - - /* resolve the file ID reference */ - tempStr[0] = 0; - pb.ioNamePtr = tempStr; - pb.ioVRefNum = volRefNum; - pb.ioFileID = fileID; - result = PBResolveFileIDRefSync((HParmBlkPtr)&pb); - require_noerr(result, PBResolveFileIDRefSync); - - /* and then make an FSRef to the file */ - result = FSMakeFSRef(volRefNum, pb.ioSrcDirID, tempStr, ref); - require_noerr(result, FSMakeFSRef); - -FSMakeFSRef: -PBResolveFileIDRefSync: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSCreateFileIDRef( - const FSRef *ref, - SInt32 *fileID) -{ - OSErr result; - FSSpec spec; - FIDParam pb; - - /* check parameters */ - require_action(NULL != fileID, BadParameter, result = paramErr); - - /* Get an FSSpec from the FSRef */ - result = FSGetCatalogInfo(ref, kFSCatInfoNone, NULL, NULL, &spec, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* Create (or get) the file ID reference using the FSSpec */ - pb.ioNamePtr = (StringPtr)spec.name; - pb.ioVRefNum = spec.vRefNum; - pb.ioSrcDirID = spec.parID; - result = PBCreateFileIDRefSync((HParmBlkPtr)&pb); - require((noErr == result) || (fidExists == result) || (afpIDExists == result), - PBCreateFileIDRefSync); - - /* return the file ID reference */ - *fileID = pb.ioFileID; - -PBCreateFileIDRefSync: -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -#pragma mark ----- Utility Routines ----- - -/*****************************************************************************/ - -Ptr -GetTempBuffer( - ByteCount buffReqSize, - ByteCount *buffActSize) -{ - enum - { - kSlopMemory = 0x00008000 /* 32K - Amount of free memory to leave when allocating buffers */ - }; - - Ptr tempPtr; - - /* check parameters */ - require_action(NULL != buffActSize, BadParameter, tempPtr = NULL); - - /* Make request a multiple of 4K bytes */ - buffReqSize = buffReqSize & 0xfffff000; - - if ( buffReqSize < 0x00001000 ) - { - /* Request was smaller than 4K bytes - make it 4K */ - buffReqSize = 0x00001000; - } - - /* Attempt to allocate the memory */ - tempPtr = NewPtr(buffReqSize); - - /* If request failed, go to backup plan */ - if ( (tempPtr == NULL) && (buffReqSize > 0x00001000) ) - { - /* - ** Try to get largest 4K byte block available - ** leaving some slop for the toolbox if possible - */ - long freeMemory = (FreeMem() - kSlopMemory) & 0xfffff000; - - buffReqSize = MaxBlock() & 0xfffff000; - - if ( buffReqSize > freeMemory ) - { - buffReqSize = freeMemory; - } - - if ( buffReqSize == 0 ) - { - buffReqSize = 0x00001000; - } - - tempPtr = NewPtr(buffReqSize); - } - - /* Return bytes allocated */ - if ( tempPtr != NULL ) - { - *buffActSize = buffReqSize; - } - else - { - *buffActSize = 0; - } - -BadParameter: - - return ( tempPtr ); -} - -/*****************************************************************************/ - -OSErr -FileRefNumGetFSRef( - short refNum, - FSRef *ref) -{ - return ( FSGetForkCBInfo(refNum, 0, NULL, NULL, NULL, ref, NULL) ); -} - -/*****************************************************************************/ - -OSErr -FSSetDefault( - const FSRef *newDefault, - FSRef *oldDefault) -{ - OSErr result; - FSVolumeRefNum vRefNum; - long dirID; - FSCatalogInfo catalogInfo; - - /* check parameters */ - require_action((NULL != newDefault) && (NULL != oldDefault), BadParameter, result = paramErr); - - /* Get nodeFlags, vRefNum and dirID (nodeID) of newDefault */ - result = FSGetCatalogInfo(newDefault, - kFSCatInfoNodeFlags + kFSCatInfoVolume + kFSCatInfoNodeID, - &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* Make sure newDefault is a directory */ - require_action(0 != (kFSNodeIsDirectoryMask & catalogInfo.nodeFlags), NewDefaultNotDirectory, - result = dirNFErr); - - /* Get the current working directory. */ - result = HGetVol(NULL, &vRefNum, &dirID); - require_noerr(result, HGetVol); - - /* Return the oldDefault FSRef */ - result = FSMakeFSRef(vRefNum, dirID, NULL, oldDefault); - require_noerr(result, FSMakeFSRef); - - /* Set the new current working directory */ - result = HSetVol(NULL, catalogInfo.volume, catalogInfo.nodeID); - require_noerr(result, HSetVol); - -HSetVol: -FSMakeFSRef: -HGetVol: -NewDefaultNotDirectory: -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ - -OSErr -FSRestoreDefault( - const FSRef *oldDefault) -{ - OSErr result; - FSCatalogInfo catalogInfo; - - /* check parameters */ - require_action(NULL != oldDefault, BadParameter, result = paramErr); - - /* Get nodeFlags, vRefNum and dirID (nodeID) of oldDefault */ - result = FSGetCatalogInfo(oldDefault, - kFSCatInfoNodeFlags + kFSCatInfoVolume + kFSCatInfoNodeID, - &catalogInfo, NULL, NULL, NULL); - require_noerr(result, FSGetCatalogInfo); - - /* Make sure oldDefault is a directory */ - require_action(0 != (kFSNodeIsDirectoryMask & catalogInfo.nodeFlags), OldDefaultNotDirectory, - result = dirNFErr); - - /* Set the current working directory to oldDefault */ - result = HSetVol(NULL, catalogInfo.volume, catalogInfo.nodeID); - require_noerr(result, HSetVol); - -HSetVol: -OldDefaultNotDirectory: -FSGetCatalogInfo: -BadParameter: - - return ( result ); -} - -/*****************************************************************************/ diff --git a/Source/MoreFilesX.h b/Source/MoreFilesX.h deleted file mode 100644 index 00560e9..0000000 --- a/Source/MoreFilesX.h +++ /dev/null @@ -1,1849 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* - File: MoreFilesX.h - - Contains: A collection of useful high-level File Manager routines - which use the HFS Plus APIs wherever possible. - - Version: MoreFilesX 1.0.1 - - Copyright: © 1992-2002 by Apple Computer, Inc., all rights reserved. - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - File Ownership: - - DRI: Apple Macintosh Developer Technical Support - - Other Contact: For bug reports, consult the following page on - the World Wide Web: - http://developer.apple.com/bugreporter/ - - Technology: DTS Sample Code - - Writers: - - (JL) Jim Luther - - Change History (most recent first): - - <3> 4/19/02 JL [2853905] Fixed #if test around header includes. - <2> 4/19/02 JL [2853901] Updated standard disclaimer. - <1> 1/25/02 JL MoreFilesX 1.0 - - Notes: - What do those arrows in the documentation for each routine mean? - - --> The parameter is an input - - <-- The parameter is an output. The pointer to the variable - where the output will be returned (must not be NULL). - - <** The parameter is an optional output. If it is not a - NULL pointer, it points to the variable where the output - will be returned. If it is a NULL pointer, the output will - not be returned and will possibly let the routine and the - File Manager do less work. If you don't need an optional output, - don't ask for it. - **> The parameter is an optional input. If it is not a - NULL pointer, it points to the variable containing the - input data. If it is a NULL pointer, the input is not used - and will possibly let the routine and the File Manager - do less work. -*/ - -#ifndef __MOREFILESX__ -#define __MOREFILESX__ - -#ifndef __CARBON__ - #if defined(__MACH__) - #include - #else - #include - #endif -#endif - -#if PRAGMA_ONCE -#pragma once -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if PRAGMA_IMPORT -#pragma import on -#endif - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=mac68k -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(push, 2) -#elif PRAGMA_STRUCT_PACK - #pragma pack(2) -#endif - -/*****************************************************************************/ - -#ifndef WIN32 -#pragma mark ----- FinderInfo and ExtendedFinderInfo ----- -#endif - -/* - * FSGetFinderInfo and FSSetFinderInfo use these unions for Finder information. - */ - -union FinderInfo -{ - FileInfo file; - FolderInfo folder; -}; -typedef union FinderInfo FinderInfo; - -union ExtendedFinderInfo -{ - ExtendedFileInfo file; - ExtendedFolderInfo folder; -}; -typedef union ExtendedFinderInfo ExtendedFinderInfo; - -/*****************************************************************************/ - -#pragma mark ----- GetVolParmsInfoBuffer Macros ----- - -/* - * Macros to get information out of GetVolParmsInfoBuffer. - */ - -/* version 1 field getters */ -#define GetVolParmsInfoVersion(volParms) \ - ((volParms)->vMVersion) -#define GetVolParmsInfoAttrib(volParms) \ - ((volParms)->vMAttrib) -#define GetVolParmsInfoLocalHand(volParms) \ - ((volParms)->vMLocalHand) -#define GetVolParmsInfoServerAdr(volParms) \ - ((volParms)->vMServerAdr) - -/* version 2 field getters (assume zero result if version < 2) */ -#define GetVolParmsInfoVolumeGrade(volParms) \ - (((volParms)->vMVersion >= 2) ? (volParms)->vMVolumeGrade : 0) -#define GetVolParmsInfoForeignPrivID(volParms) \ - (((volParms)->vMVersion >= 2) ? (volParms)->vMForeignPrivID : 0) - -/* version 3 field getters (assume zero result if version < 3) */ -#define GetVolParmsInfoExtendedAttributes(volParms) \ - (((volParms)->vMVersion >= 3) ? (volParms)->vMExtendedAttributes : 0) - -/* attribute bits supported by all versions of GetVolParmsInfoBuffer */ -#define VolIsNetworkVolume(volParms) \ - ((volParms)->vMServerAdr != 0) -#define VolHasLimitFCBs(volParms) \ - (((volParms)->vMAttrib & (1L << bLimitFCBs)) != 0) -#define VolHasLocalWList(volParms) \ - (((volParms)->vMAttrib & (1L << bLocalWList)) != 0) -#define VolHasNoMiniFndr(volParms) \ - (((volParms)->vMAttrib & (1L << bNoMiniFndr)) != 0) -#define VolHasNoVNEdit(volParms) \ - (((volParms)->vMAttrib & (1L << bNoVNEdit)) != 0) -#define VolHasNoLclSync(volParms) \ - (((volParms)->vMAttrib & (1L << bNoLclSync)) != 0) -#define VolHasTrshOffLine(volParms) \ - (((volParms)->vMAttrib & (1L << bTrshOffLine)) != 0) -#define VolHasNoSwitchTo(volParms) \ - (((volParms)->vMAttrib & (1L << bNoSwitchTo)) != 0) -#define VolHasNoDeskItems(volParms) \ - (((volParms)->vMAttrib & (1L << bNoDeskItems)) != 0) -#define VolHasNoBootBlks(volParms) \ - (((volParms)->vMAttrib & (1L << bNoBootBlks)) != 0) -#define VolHasAccessCntl(volParms) \ - (((volParms)->vMAttrib & (1L << bAccessCntl)) != 0) -#define VolHasNoSysDir(volParms) \ - (((volParms)->vMAttrib & (1L << bNoSysDir)) != 0) -#define VolHasExtFSVol(volParms) \ - (((volParms)->vMAttrib & (1L << bHasExtFSVol)) != 0) -#define VolHasOpenDeny(volParms) \ - (((volParms)->vMAttrib & (1L << bHasOpenDeny)) != 0) -#define VolHasCopyFile(volParms) \ - (((volParms)->vMAttrib & (1L << bHasCopyFile)) != 0) -#define VolHasMoveRename(volParms) \ - (((volParms)->vMAttrib & (1L << bHasMoveRename)) != 0) -#define VolHasDesktopMgr(volParms) \ - (((volParms)->vMAttrib & (1L << bHasDesktopMgr)) != 0) -#define VolHasShortName(volParms) \ - (((volParms)->vMAttrib & (1L << bHasShortName)) != 0) -#define VolHasFolderLock(volParms) \ - (((volParms)->vMAttrib & (1L << bHasFolderLock)) != 0) -#define VolHasPersonalAccessPrivileges(volParms) \ - (((volParms)->vMAttrib & (1L << bHasPersonalAccessPrivileges)) != 0) -#define VolHasUserGroupList(volParms) \ - (((volParms)->vMAttrib & (1L << bHasUserGroupList)) != 0) -#define VolHasCatSearch(volParms) \ - (((volParms)->vMAttrib & (1L << bHasCatSearch)) != 0) -#define VolHasFileIDs(volParms) \ - (((volParms)->vMAttrib & (1L << bHasFileIDs)) != 0) -#define VolHasBTreeMgr(volParms) \ - (((volParms)->vMAttrib & (1L << bHasBTreeMgr)) != 0) -#define VolHasBlankAccessPrivileges(volParms) \ - (((volParms)->vMAttrib & (1L << bHasBlankAccessPrivileges)) != 0) -#define VolSupportsAsyncRequests(volParms) \ - (((volParms)->vMAttrib & (1L << bSupportsAsyncRequests)) != 0) -#define VolSupportsTrashVolumeCache(volParms) \ - (((volParms)->vMAttrib & (1L << bSupportsTrashVolumeCache)) != 0) - -/* attribute bits supported by version 3 and greater versions of GetVolParmsInfoBuffer */ -#define VolIsEjectable(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bIsEjectable)) != 0) -#define VolSupportsHFSPlusAPIs(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsHFSPlusAPIs)) != 0) -#define VolSupportsFSCatalogSearch(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsFSCatalogSearch)) != 0) -#define VolSupportsFSExchangeObjects(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsFSExchangeObjects)) != 0) -#define VolSupports2TBFiles(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupports2TBFiles)) != 0) -#define VolSupportsLongNames(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsLongNames)) != 0) -#define VolSupportsMultiScriptNames(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsMultiScriptNames)) != 0) -#define VolSupportsNamedForks(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsNamedForks)) != 0) -#define VolSupportsSubtreeIterators(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsSubtreeIterators)) != 0) -#define VolL2PCanMapFileBlocks(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bL2PCanMapFileBlocks)) != 0) -#define VolParentModDateChanges(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bParentModDateChanges)) != 0) -#define VolAncestorModDateChanges(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bAncestorModDateChanges)) != 0) -#define VolSupportsSymbolicLinks(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bSupportsSymbolicLinks)) != 0) -#define VolIsAutoMounted(volParms) \ - ((GetVolParmsInfoExtendedAttributes(volParms) & (1L << bIsAutoMounted)) != 0) - -/*****************************************************************************/ - -#pragma mark ----- userPrivileges Bit Masks and Macros ----- - -/* - * Bit masks and macros to get common information out of userPrivileges byte - * returned by FSGetCatalogInfo. - * - * Note: The userPrivileges byte is the same as the ioACUser byte returned - * by PBGetCatInfo, and is the 1's complement of the user's privileges - * byte returned in ioACAccess by PBHGetDirAccess. That's where the - * ioACUser names came from. - * - * The userPrivileges are user's effective privileges based on the - * user ID and the groups that user belongs to, and the owner, group, - * and everyone privileges for the given directory. - */ - -enum -{ - /* mask for just the access restriction bits */ - kioACUserAccessMask = (kioACUserNoSeeFolderMask + - kioACUserNoSeeFilesMask + - kioACUserNoMakeChangesMask), - /* common access privilege settings */ - kioACUserFull = 0x00, /* no access restiction bits on */ - kioACUserNone = kioACUserAccessMask, /* all access restiction bits on */ - kioACUserDropBox = (kioACUserNoSeeFolderMask + - kioACUserNoSeeFilesMask), /* make changes, but not see files or folders */ - kioACUserBulletinBoard = kioACUserNoMakeChangesMask /* see files and folders, but not make changes */ -}; - - -/* Macros for testing ioACUser bits. */ - -#define UserIsOwner(userPrivileges) \ - (((userPrivileges) & kioACUserNotOwnerMask) == 0) -#define UserHasFullAccess(userPrivileges) \ - (((userPrivileges) & (kioACUserAccessMask)) == kioACUserFull) -#define UserHasDropBoxAccess(userPrivileges) \ - (((userPrivileges) & kioACUserAccessMask) == kioACUserDropBox) -#define UserHasBulletinBoard(userPrivileges) \ - (((userPrivileges) & kioACUserAccessMask) == kioACUserBulletinBoard) -#define UserHasNoAccess(userPrivileges) \ - (((userPrivileges) & kioACUserAccessMask) == kioACUserNone) - -/*****************************************************************************/ - -#pragma mark ----- File Access Routines ----- - -/*****************************************************************************/ - -#pragma mark FSCopyFork - -OSErr -FSCopyFork( - SInt16 srcRefNum, - SInt16 dstRefNum, - void *copyBufferPtr, - ByteCount copyBufferSize); - -/* - The FSCopyFork function copies all data from the source fork to the - destination fork of open file forks and makes sure the destination EOF - is equal to the source EOF. - - srcRefNum --> The source file reference number. - dstRefNum --> The destination file reference number. - copyBufferPtr --> Pointer to buffer to use during copy. The - buffer should be at least 4K-bytes minimum. - The larger the buffer, the faster the copy - (up to a point). - copyBufferSize --> The size of the copy buffer. -*/ - -/*****************************************************************************/ - -#pragma mark ----- Volume Access Routines ----- - -/*****************************************************************************/ - -#pragma mark FSGetVolParms - -OSErr -FSGetVolParms( - FSVolumeRefNum volRefNum, - UInt32 bufferSize, - GetVolParmsInfoBuffer *volParmsInfo, - UInt32 *actualInfoSize); - -/* - The FSGetVolParms function returns information about the characteristics - of a volume. A result of paramErr usually just means the volume doesn't - support GetVolParms and the feature you were going to check - for isn't available. - - volRefNum --> Volume specification. - bufferSize --> Size of buffer pointed to by volParmsInfo. - volParmsInfo <-- A GetVolParmsInfoBuffer record where the volume - attributes information is returned. - actualInfoSize <-- The number of bytes actually returned - in volParmsInfo. - - __________ - - Also see: The GetVolParmsInfoBuffer Macros for checking attribute bits - in this file -*/ - -/*****************************************************************************/ - -#pragma mark FSGetVRefNum - -OSErr -FSGetVRefNum( - const FSRef *ref, - FSVolumeRefNum *vRefNum); - -/* - The FSGetVRefNum function determines the volume reference - number of a volume from a FSRef. - - ref --> The FSRef. - vRefNum <-- The volume reference number. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetVInfo - -OSErr -FSGetVInfo( - FSVolumeRefNum volume, - HFSUniStr255 *volumeName, /* can be NULL */ - UInt64 *freeBytes, /* can be NULL */ - UInt64 *totalBytes); /* can be NULL */ - -/* - The FSGetVInfo function returns the name, available space (in bytes), - and total space (in bytes) for the specified volume. - - volume --> The volume reference number. - volumeName <** An optional pointer to a HFSUniStr255. - If not NULL, the volume name will be returned in - the HFSUniStr255. - freeBytes <** An optional pointer to a UInt64. - If not NULL, the number of free bytes on the - volume will be returned in the UInt64. - totalBytes <** An optional pointer to a UInt64. - If not NULL, the total number of bytes on the - volume will be returned in the UInt64. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetVolFileSystemID - -OSErr -FSGetVolFileSystemID( - FSVolumeRefNum volume, - UInt16 *fileSystemID, /* can be NULL */ - UInt16 *signature); /* can be NULL */ - -/* - The FSGetVolFileSystemID function returns the file system ID and signature - of a mounted volume. The file system ID identifies the file system - that handles requests to a particular volume. The signature identifies the - volume type of the volume (for example, FSID 0 is Macintosh HFS Plus, HFS - or MFS, where a signature of 0x4244 identifies the volume as HFS). - Here's a partial list of file system ID numbers (only Apple's file systems - are listed): - FSID File System - ----- ----------------------------------------------------- - $0000 Macintosh HFS Plus, HFS or MFS - $0100 ProDOS File System - $0101 PowerTalk Mail Enclosures - $4147 ISO 9660 File Access (through Foreign File Access) - $4242 High Sierra File Access (through Foreign File Access) - $464D QuickTake File System (through Foreign File Access) - $4953 Macintosh PC Exchange (MS-DOS) - $4A48 Audio CD Access (through Foreign File Access) - $4D4B Apple Photo Access (through Foreign File Access) - $6173 AppleShare (later versions of AppleShare only) - - See the Technical Note "FL 35 - Determining Which File System - Is Active" and the "Guide to the File System Manager" for more - information. - - volume --> The volume reference number. - fileSystemID <** An optional pointer to a UInt16. - If not NULL, the volume's file system ID will - be returned in the UInt16. - signature <** An optional pointer to a UInt16. - If not NULL, the volume's signature will - be returned in the UInt16. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetMountedVolumes - -OSErr -FSGetMountedVolumes( - FSRef ***volumeRefsHandle, /* pointer to handle of FSRefs */ - ItemCount *numVolumes); - -/* - The FSGetMountedVolumes function returns the list of volumes currently - mounted in an array of FSRef records. The array of FSRef records is - returned in a Handle, volumeRefsHandle, which is allocated by - FSGetMountedVolumes. The caller is responsible for disposing of - volumeRefsHandle if the FSGetMountedVolumes returns noErr. - - volumeRefsHandle <-- Pointer to an FSRef Handle where the array of - FSRefs is to be returned. - numVolumes <-- The number of volumes returned in the array. -*/ - -/*****************************************************************************/ - -#pragma mark ----- FSRef/FSpec/Path/Name Conversion Routines ----- - -/*****************************************************************************/ - -#pragma mark FSRefMakeFSSpec - -OSErr -FSRefMakeFSSpec( - const FSRef *ref, - FSSpec *spec); - -/* - The FSRefMakeFSSpec function returns an FSSpec for the file or - directory specified by the ref parameter. - - ref --> An FSRef specifying the file or directory. - spec <-- The FSSpec. -*/ - -/*****************************************************************************/ - -#pragma mark FSMakeFSRef - -OSErr -FSMakeFSRef( - FSVolumeRefNum volRefNum, - SInt32 dirID, - ConstStr255Param name, - FSRef *ref); - -/* - The FSMakeFSRef function creates an FSRef from the traditional - volume reference number, directory ID and pathname inputs. It is - functionally equivalent to FSMakeFSSpec followed by FSpMakeFSRef. - - volRefNum --> Volume specification. - dirID --> Directory specification. - name --> The file or directory name, or NULL. - ref <-- The FSRef. -*/ - -/*****************************************************************************/ - -#pragma mark FSMakePath - -OSStatus -FSMakePath( - SInt16 vRefNum, - SInt32 dirID, - ConstStr255Param name, - UInt8 *path, - UInt32 maxPathSize); - -/* - The FSMakePath function creates a pathname from the traditional volume reference - number, directory ID, and pathname inputs. It is functionally equivalent to - FSMakeFSSpec, FSpMakeFSRef, FSRefMakePath. - - volRefNum --> Volume specification. - dirID --> Directory specification. - name --> The file or directory name, or NULL. - path <-- A pointer to a buffer which FSMakePath will - fill with a C string representing the pathname - to the file or directory specified. The format of - the pathname returned can be determined with the - Gestalt selector gestaltFSAttr's - gestaltFSUsesPOSIXPathsForConversion bit. - If the gestaltFSUsesPOSIXPathsForConversion bit is - clear, the pathname is a Mac OS File Manager full - pathname in a C string, and file or directory names - in the pathname may be mangled as returned by - the File Manager. If the - gestaltFSUsesPOSIXPathsForConversion bit is set, - the pathname is a UTF8 encoded POSIX absolute - pathname in a C string. In either case, the - pathname returned can be passed back to - FSPathMakeRef to create an FSRef to the file or - directory, or FSPathMakeFSSpec to craete an FSSpec - to the file or directory. - maxPathSize --> The size of the path buffer in bytes. If the path - buffer is too small for the pathname string, - FSMakePath returns pathTooLongErr or - buffersTooSmall. -*/ - -/*****************************************************************************/ - -#pragma mark FSPathMakeFSSpec - -OSStatus -FSPathMakeFSSpec( - const UInt8 *path, - FSSpec *spec, - Boolean *isDirectory); /* can be NULL */ - -/* - The FSPathMakeFSSpec function converts a pathname to an FSSpec. - - path --> A pointer to a C String that is the pathname. The - format of the pathname you must supply can be - determined with the Gestalt selector gestaltFSAttr's - gestaltFSUsesPOSIXPathsForConversion bit. - If the gestaltFSUsesPOSIXPathsForConversion bit is - clear, the pathname must be a Mac OS File Manager - full pathname in a C string. If the - gestaltFSUsesPOSIXPathsForConversion bit is set, - the pathname must be a UTF8 encoded POSIX absolute - pathname in a C string. - spec <-- The FSSpec. - isDirectory <** An optional pointer to a Boolean. - If not NULL, true will be returned in the Boolean - if the specified path is a directory, or false will - be returned in the Boolean if the specified path is - a file. -*/ - -/*****************************************************************************/ - -#pragma mark UnicodeNameGetHFSName - -OSErr -UnicodeNameGetHFSName( - UniCharCount nameLength, - const UniChar *name, - TextEncoding textEncodingHint, - Boolean isVolumeName, - Str31 hfsName); - -/* - The UnicodeNameGetHFSName function converts a Unicode string - to a Pascal Str31 (or Str27) string using an algorithm similar to that used - by the File Manager. Note that if the name is too long or cannot be converted - using the given text encoding hint, you will get an error instead of the - mangled name that the File Manager would return. - - nameLength --> Number of UniChar in name parameter. - name --> The Unicode string to convert. - textEncodingHint --> The text encoding hint used for the conversion. - You can pass kTextEncodingUnknown to use the - "default" textEncodingHint. - isVolumeName --> If true, the output name will be limited to - 27 characters (kHFSMaxVolumeNameChars). If false, - the output name will be limited to 31 characters - (kHFSMaxFileNameChars). - hfsName <-- The hfsName as a Pascal string. - - __________ - - Also see: HFSNameGetUnicodeName -*/ - -/*****************************************************************************/ - -#pragma mark HFSNameGetUnicodeName - -OSErr -HFSNameGetUnicodeName( - ConstStr31Param hfsName, - TextEncoding textEncodingHint, - HFSUniStr255 *unicodeName); - -/* - The HFSNameGetUnicodeName function converts a Pascal Str31 string to an - Unicode HFSUniStr255 string using the same routines as the File Manager. - - hfsName --> The Pascal string to convert. - textEncodingHint --> The text encoding hint used for the conversion. - You can pass kTextEncodingUnknown to use the - "default" textEncodingHint. - unicodeName <-- The Unicode string. - - __________ - - Also see: UnicodeNameGetHFSName -*/ - -/*****************************************************************************/ - -#pragma mark ----- File/Directory Manipulation Routines ----- - -/*****************************************************************************/ - -#pragma mark FSRefValid - -Boolean FSRefValid(const FSRef *ref); - -/* - The FSRefValid function determines if an FSRef is valid. If the result is - true, then the FSRef refers to an existing file or directory. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetParentRef - -OSErr -FSGetParentRef( - const FSRef *ref, - FSRef *parentRef); - -/* - The FSGetParentRef function gets the parent directory FSRef of the - specified object. - - Note: FSRefs always point to real file system objects. So, there cannot - be a FSRef to the parent of volume root directories. If you call - FSGetParentRef with a ref to the root directory of a volume, the - function result will be noErr and the parentRef will be invalid (using it - for other file system requests will fail). - - ref --> FSRef to a file or directory. - parentRef <-- The parent directory's FSRef. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetFileDirName - -OSErr -FSGetFileDirName( - const FSRef *ref, - HFSUniStr255 *outName); - -/* - The FSGetFileDirName function gets the name of the file or directory - specified. - - ref --> FSRef to a file or directory. - outName <-- The file or directory name. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetNodeID - -OSErr -FSGetNodeID( - const FSRef *ref, - long *nodeID, /* can be NULL */ - Boolean *isDirectory); /* can be NULL */ - -/* - The GetNodeIDFromFSRef function gets the node ID number of the - file or directory specified (note: the node ID is the directory ID - for directories). - - ref --> FSRef to a file or directory. - nodeID <** An optional pointer to a long. - If not NULL, the node ID will be returned in - the long. - isDirectory <** An optional pointer to a Boolean. - If not NULL, true will be returned in the Boolean - if the object is a directory, or false will be - returned in the Boolean if object is a file. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetUserPrivilegesPermissions - -OSErr -FSGetUserPrivilegesPermissions( - const FSRef *ref, - UInt8 *userPrivileges, /* can be NULL */ - UInt32 permissions[4]); /* can be NULL */ - -/* - The FSGetUserPrivilegesPermissions function gets the userPrivileges and/or - permissions of the file or directory specified. - - ref --> FSRef to a file or directory. - userPrivileges <** An optional pointer to a UInt8. - If not NULL, the userPrivileges will be returned - in the UInt8. - permissions <** An optional pointer to an UInt32[4] array. - If not NULL, the permissions will be returned - in the UInt32[4] array. -*/ - -/*****************************************************************************/ - -#pragma mark FSCheckLock - -OSErr -FSCheckLock( - const FSRef *ref); - -/* - The FSCheckLock function determines if a file or directory is locked. - If FSCheckLock returns noErr, then the file or directory is not locked - and the volume it is on is not locked either. If FSCheckLock returns - fLckdErr, then the file or directory is locked. If FSCheckLock returns - wPrErr, then the volume is locked by hardware (i.e., locked tab on - removable media). If FSCheckLock returns vLckdErr, then the volume is - locked by software. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetForkSizes - -OSErr -FSGetForkSizes( - const FSRef *ref, - UInt64 *dataLogicalSize, /* can be NULL */ - UInt64 *rsrcLogicalSize); /* can be NULL */ - -/* - The FSGetForkSizes returns the size of the data and/or resource fork for - the specified file. - - ref --> FSRef to a file or directory. - dataLogicalSize <** An optional pointer to a UInt64. - If not NULL, the data fork's size will be - returned in the UInt64. - rsrcLogicalSize <** An optional pointer to a UInt64. - If not NULL, the resource fork's size will be - returned in the UInt64. - - __________ - - Also see: FSGetTotalForkSizes -*/ - -/*****************************************************************************/ - -#pragma mark FSGetTotalForkSizes - -OSErr -FSGetTotalForkSizes( - const FSRef *ref, - UInt64 *totalLogicalSize, /* can be NULL */ - UInt64 *totalPhysicalSize, /* can be NULL */ - ItemCount *forkCount); /* can be NULL */ - -/* - The FSGetTotalForkSizes returns the total logical size and/or the total - physical size of the specified file (i.e., it adds the sizes of all file - forks). It optionally returns the number of file forks. - - ref --> FSRef to a file or directory. - totalLogicalSize <** An optional pointer to a UInt64. - If not NULL, the sum of all fork logical sizes - will be returned in the UInt64. - totalPhysicalSize <** An optional pointer to a UInt64. - If not NULL, the sum of all fork physical sizes - will be returned in the UInt64. - forkCount <** An optional pointer to a ItemCount. - If not NULL, the number of file forks - will be returned in the ItemCount. - - __________ - - Also see: FSGetForkSizes -*/ - -/*****************************************************************************/ - -#pragma mark FSBumpDate - -OSErr -FSBumpDate( - const FSRef *ref); - -/* - The FSBumpDate function changes the content modification date of a file - or directory to the current date/time. If the content modification date - is already equal to the current date/time, then add one second to the - content modification date. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetFinderInfo - -OSErr -FSGetFinderInfo( - const FSRef *ref, - FinderInfo *info, /* can be NULL */ - ExtendedFinderInfo *extendedInfo, /* can be NULL */ - Boolean *isDirectory); /* can be NULL */ - -/* - The FSGetFinderInfo function gets the finder information for a file or - directory. - - ref --> FSRef to a file or directory. - info <** An optional pointer to a FinderInfo. - If not NULL, the FileInfo (if ref is a file) or - the FolderInfo (if ref is a folder) will be - returned in the FinderInfo. - extendedInfo <** An optional pointer to a ExtendedFinderInfo. - If not NULL, the ExtendedFileInfo (if ref is a file) - or the ExtendedFolderInfo (if ref is a folder) will - be returned in the ExtendedFinderInfo. - isDirectory <** An optional pointer to a Boolean. - If not NULL, true will be returned in the Boolean - if the object is a directory, or false will be - returned in the Boolean if object is a file. - - __________ - - Also see: FSSetFinderInfo -*/ - -/*****************************************************************************/ - -#pragma mark FSSetFinderInfo - -OSErr -FSSetFinderInfo( - const FSRef *ref, - const FinderInfo *info, /* can be NULL */ - const ExtendedFinderInfo *extendedInfo); /* can be NULL */ - -/* - The FSSetFinderInfo function sets the finder information for a file or - directory. - - ref --> FSRef to a file or directory. - info **> A pointer to a FinderInfo record with the new - FileInfo (if ref is a file) or new FolderInfo - (if ref is a folder), or NULL if the FinderInfo - is not to be changed. - extendedInfo **> A pointer to a FinderInfo record with the new - ExtendedFileInfo (if ref is a file) or new - ExtendedFolderInfo (if ref is a folder), or NULL - if the ExtendedFinderInfo is not to be changed. - - __________ - - Also see: FSGetFinderInfo -*/ - -/*****************************************************************************/ - -#pragma mark FSChangeCreatorType - -OSErr -FSChangeCreatorType( - const FSRef *ref, - OSType fileCreator, - OSType fileType); - -/* - The FSChangeCreatorType function changes the creator and/or file type of a file. - - ref --> FSRef to a file. - creator --> The new creator type or 0x00000000 to leave - the creator type alone. - fileType --> The new file type or 0x00000000 to leave the - file type alone. -*/ - -/*****************************************************************************/ - -#pragma mark FSChangeFinderFlags - -OSErr -FSChangeFinderFlags( - const FSRef *ref, - Boolean setBits, - UInt16 flagBits); - -/* - The FSChangeFinderFlags function sets or clears flag bits in - the finderFlags field of a file's FileInfo record or a - directory's FolderInfo record. - - ref --> FSRef to a file or directory. - setBits --> If true, then set the bits specified in flagBits. - If false, then clear the bits specified in flagBits. - flagBits --> The flagBits parameter specifies which Finder Flag - bits to set or clear. If a bit in flagBits is set, - then the same bit in fdFlags is either set or - cleared depending on the state of the setBits - parameter. -*/ - -/*****************************************************************************/ - -#pragma mark FSSetInvisible - -OSErr -FSSetInvisible( - const FSRef *ref); - -#pragma mark FSClearInvisible - -OSErr -FSClearInvisible( - const FSRef *ref); - -/* - The FSSetInvisible and FSClearInvisible functions set or clear the - kIsInvisible bit in the finderFlags field of the specified file or - directory's finder information. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSSetNameLocked - -OSErr -FSSetNameLocked( - const FSRef *ref); - -#pragma mark FSClearNameLocked - -OSErr -FSClearNameLocked( - const FSRef *ref); - -/* - The FSSetNameLocked and FSClearNameLocked functions set or clear the - kNameLocked bit bit in the finderFlags field of the specified file or - directory's finder information. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSSetIsStationery - -OSErr -FSSetIsStationery( - const FSRef *ref); - -#pragma mark FSClearIsStationery - -OSErr -FSClearIsStationery( - const FSRef *ref); - -/* - The FSSetIsStationery and FSClearIsStationery functions set or clear the - kIsStationery bit bit in the finderFlags field of the specified file or - directory's finder information. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSSetHasCustomIcon - -OSErr -FSSetHasCustomIcon( - const FSRef *ref); - -#pragma mark FSClearHasCustomIcon - -OSErr -FSClearHasCustomIcon( - const FSRef *ref); - -/* - The FSSetHasCustomIcon and FSClearHasCustomIcon functions set or clear the - kHasCustomIcon bit bit in the finderFlags field of the specified file or - directory's finder information. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSClearHasBeenInited - -OSErr -FSClearHasBeenInited( - const FSRef *ref); - -/* - The FSClearHasBeenInited function clears the kHasBeenInited bit in the - finderFlags field of the specified file or directory's finder information. - - Note: There is no FSSetHasBeenInited function because ONLY the Finder - should set the kHasBeenInited bit. - - ref --> FSRef to a file or directory. -*/ - -/*****************************************************************************/ - -#pragma mark FSCopyFileMgrAttributes - -OSErr -FSCopyFileMgrAttributes( - const FSRef *sourceRef, - const FSRef *destinationRef, - Boolean copyLockBit); - -/* - The CopyFileMgrAttributes function copies all File Manager attributes - from the source file or directory to the destination file or directory. - If copyLockBit is true, then set the locked state of the destination - to match the source. - - sourceRef --> FSRef to a file or directory. - destinationRef --> FSRef to a file or directory. - copyLockBit --> If true, set the locked state of the destination - to match the source. -*/ - -/*****************************************************************************/ - -#pragma mark FSMoveRenameObjectUnicode - -OSErr -FSMoveRenameObjectUnicode( - const FSRef *ref, - const FSRef *destDirectory, - UniCharCount nameLength, - const UniChar *name, /* can be NULL (no rename during move) */ - TextEncoding textEncodingHint, - FSRef *newRef); /* if function fails along the way, newRef is final location of file */ - -/* - The FSMoveRenameObjectUnicode function moves a file or directory and - optionally renames it. The source and destination locations must be on - the same volume. - - Note: If the input ref parameter is invalid, this call will fail and - newRef, like ref, will be invalid. - - ref --> FSRef to a file or directory. - destDirectory --> FSRef to the destination directory. - nameLength --> Number of UniChar in name parameter. - name --> An Unicode string with the new name for the - moved object, or NULL if no rename is wanted. - textEncodingHint --> The text encoding hint used for the rename. - You can pass kTextEncodingUnknown to use the - "default" textEncodingHint. - newRef <-- The new FSRef of the object moved. Note that if - this function fails at any step along the way, - newRef is still then final location of the object. -*/ - -/*****************************************************************************/ - -#pragma mark FSDeleteContainerContents - -OSErr -FSDeleteContainerContents( - const FSRef *container); - -/* - The FSDeleteContainerContents function deletes the contents of a container - directory. All files and subdirectories in the specified container are - deleted. If a locked file or directory is encountered, it is unlocked and - then deleted. If any unexpected errors are encountered, - FSDeleteContainerContents quits and returns to the caller. - - container --> FSRef to a directory. - - __________ - - Also see: FSDeleteContainer -*/ - -/*****************************************************************************/ - -#pragma mark FSDeleteContainer - -OSErr -FSDeleteContainer( - const FSRef *container); - -/* - The FSDeleteContainer function deletes a container directory and its contents. - All files and subdirectories in the specified container are deleted. - If a locked file or directory is encountered, it is unlocked and then - deleted. After deleting the container's contents, the container is - deleted. If any unexpected errors are encountered, FSDeleteContainer - quits and returns to the caller. - - container --> FSRef to a directory. - - __________ - - Also see: FSDeleteContainerContents -*/ - -/*****************************************************************************/ - -#pragma mark IterateContainerFilterProcPtr - -typedef CALLBACK_API( Boolean , IterateContainerFilterProcPtr ) ( - Boolean containerChanged, - ItemCount currentLevel, - const FSCatalogInfo *catalogInfo, - const FSRef *ref, - const FSSpec *spec, - const HFSUniStr255 *name, - void *yourDataPtr); - -/* - This is the prototype for the IterateContainerFilterProc function which - is called once for each file and directory found by FSIterateContainer. - The IterateContainerFilterProc can use the read-only data it receives for - whatever it wants. - - The result of the IterateContainerFilterProc function indicates if - iteration should be stopped. To stop iteration, return true; to continue - iteration, return false. - - The yourDataPtr parameter can point to whatever data structure you might - want to access from within the IterateContainerFilterProc. - - containerChanged --> Set to true if the container's contents changed - during iteration. - currentLevel --> The current recursion level into the container. - 1 = the container, 2 = the container's immediate - subdirectories, etc. - catalogInfo --> The catalog information for the current object. - Only the fields requested by the whichInfo - parameter passed to FSIterateContainer are valid. - ref --> The FSRef to the current object. - spec --> The FSSpec to the current object if the wantFSSpec - parameter passed to FSIterateContainer is true. - name --> The name of the current object if the wantName - parameter passed to FSIterateContainer is true. - yourDataPtr --> An optional pointer to whatever data structure you - might want to access from within the - IterateFilterProc. - result <-- To stop iteration, return true; to continue - iteration, return false. - - __________ - - Also see: FSIterateContainer -*/ - -/*****************************************************************************/ - -#pragma mark CallIterateContainerFilterProc - -#define CallIterateContainerFilterProc(userRoutine, containerChanged, currentLevel, catalogInfo, ref, spec, name, yourDataPtr) \ - (*(userRoutine))((containerChanged), (currentLevel), (catalogInfo), (ref), (spec), (name), (yourDataPtr)) - -/*****************************************************************************/ - -#pragma mark FSIterateContainer - -OSErr -FSIterateContainer( - const FSRef *container, - ItemCount maxLevels, - FSCatalogInfoBitmap whichInfo, - Boolean wantFSSpec, - Boolean wantName, - IterateContainerFilterProcPtr iterateFilter, - void *yourDataPtr); - -/* - The FSIterateContainer function performs a recursive iteration (scan) of the - specified container directory and calls your IterateContainerFilterProc - function once for each file and directory found. - - The maxLevels parameter lets you control how deep the recursion goes. - If maxLevels is 1, FSIterateContainer only scans the specified directory; - if maxLevels is 2, FSIterateContainer scans the specified directory and - one subdirectory below the specified directory; etc. Set maxLevels to - zero to scan all levels. - - The yourDataPtr parameter can point to whatever data structure you might - want to access from within your IterateContainerFilterProc. - - container --> The FSRef to the container directory to iterate. - maxLevels --> Maximum number of directory levels to scan or - zero to scan all directory levels. - whichInfo --> The fields of the FSCatalogInfo you wish to get. - wantFSSpec --> Set to true if you want the FSSpec to each - object passed to your IterateContainerFilterProc. - wantName --> Set to true if you want the name of each - object passed to your IterateContainerFilterProc. - iterateFilter --> A pointer to the IterateContainerFilterProc you - want called once for each file and directory found - by FSIterateContainer. - yourDataPtr --> An optional pointer to whatever data structure you - might want to access from within the - IterateFilterProc. -*/ - -/*****************************************************************************/ - -#pragma mark FSGetDirectoryItems - -OSErr -FSGetDirectoryItems( - const FSRef *container, - FSRef ***refsHandle, /* pointer to handle of FSRefs */ - ItemCount *numRefs, - Boolean *containerChanged); - -/* - The FSGetDirectoryItems function returns the list of items in the specified - container. The array of FSRef records is returned in a Handle, refsHandle, - which is allocated by FSGetDirectoryItems. The caller is responsible for - disposing of refsHandle if the FSGetDirectoryItems returns noErr. - - container --> FSRef to a directory. - refsHandle <-- Pointer to an FSRef Handle where the array of - FSRefs is to be returned. - numRefs <-- The number of FSRefs returned in the array. - containerChanged <-- Set to true if the container changes while the - list of items is being obtained. -*/ - -/*****************************************************************************/ - -#pragma mark FSExchangeObjectsCompat - -OSErr -FSExchangeObjectsCompat( - const FSRef *sourceRef, - const FSRef *destRef, - FSRef *newSourceRef, - FSRef *newDestRef); - -/* - The FSExchangeObjectsCompat function exchanges the data between two files. - - The FSExchangeObjectsCompat function is an enhanced version of - FSExchangeObjects function. The two enhancements FSExchangeObjectsCompat - provides are: - - 1, FSExchangeObjectsCompat will work on volumes which do not support - FSExchangeObjects. FSExchangeObjectsCompat does this by emulating - FSExchangeObjects through a series of File Manager operations. If - there is a failure at any step along the way, FSExchangeObjectsCompat - attempts to undo any steps already taken to leave the files in their - original state in their original locations. - - 2. FSExchangeObjectsCompat returns new FSRefs to the source and - destination files. Note that if this function fails at any step along - the way, newSourceRef and newDestRef still give you access to the final - locations of the files being exchanged -- even if they are renamed or - not in their original locations. - - sourceRef --> FSRef to the source file. - destRef --> FSRef to the destination file. - newSourceRef <-- The new FSRef to the source file. - newDestRef <-- The new FSRef to the destination file. -*/ - -/*****************************************************************************/ - -#pragma mark ----- Shared Environment Routines ----- - -/*****************************************************************************/ - -#pragma mark FSLockRange - -OSErr -FSLockRange( - SInt16 refNum, - SInt32 rangeLength, - SInt32 rangeStart); - -/* - The LockRange function locks (denies access to) a portion of a file - that was opened with shared read/write permission. - - refNum --> The file reference number of an open file. - rangeLength --> The number of bytes in the range. - rangeStart --> The starting byte in the range to lock. - - __________ - - Also see: UnlockRange -*/ - -/*****************************************************************************/ - -#pragma mark FSUnlockRange - -OSErr -FSUnlockRange( - SInt16 refNum, - SInt32 rangeLength, - SInt32 rangeStart); - -/* - The UnlockRange function unlocks (allows access to) a previously locked - portion of a file that was opened with shared read/write permission. - - refNum --> The file reference number of an open file. - rangeLength --> The number of bytes in the range. - rangeStart --> The starting byte in the range to unlock. - - __________ - - Also see: LockRange -*/ - -/*****************************************************************************/ - -#pragma mark FSGetDirAccess - -OSErr -FSGetDirAccess( - const FSRef *ref, - SInt32 *ownerID, /* can be NULL */ - SInt32 *groupID, /* can be NULL */ - SInt32 *accessRights); /* can be NULL */ - -/* - The FSGetDirAccess function retrieves the directory access control - information for a directory on a shared volume. - - ref --> An FSRef specifying the directory. - ownerID <** An optional pointer to a SInt32. - If not NULL, the directory's owner ID - will be returned in the SInt32. - groupID <** An optional pointer to a SInt32. - If not NULL, the directory's group ID, or 0 - if no group affiliation, will be returned in - the SInt32. - accessRights <** An optional pointer to a SInt32. - If not NULL, the directory's access rights - will be returned in the SInt32. - - __________ - - Also see: FSSetDirAccess, FSMapID, FSMapName -*/ - -/*****************************************************************************/ - -#pragma mark FSSetDirAccess - -OSErr -FSSetDirAccess( - const FSRef *ref, - SInt32 ownerID, - SInt32 groupID, - SInt32 accessRights); - -/* - The FSpSetDirAccess function changes the directory access control - information for a directory on a shared volume. You must be the owner of - a directory to change its access control information. - - ref --> An FSRef specifying the directory. - ownerID --> The directory's owner ID. - groupID --> The directory's group ID or 0 if no group affiliation. - accessRights --> The directory's access rights. - - __________ - - Also see: FSGetDirAccess, FSMapID, FSMapName -*/ - -/*****************************************************************************/ - -#pragma mark FSGetVolMountInfoSize - -OSErr -FSGetVolMountInfoSize( - FSVolumeRefNum volRefNum, - SInt16 *size); - -/* - The FSGetVolMountInfoSize function determines the how much space the - program needs to allocate for a volume mounting information record. - - volRefNum --> Volume specification. - size <-- The space needed (in bytes) of the volume - mounting information record. - - __________ - - Also see: FSGetVolMountInfo, VolumeMount -*/ - -/*****************************************************************************/ - -#pragma mark FSGetVolMountInfo - -OSErr -FSGetVolMountInfo( - FSVolumeRefNum volRefNum, - void *volMountInfo); - -/* - The FSGetVolMountInfo function retrieves a volume mounting information - record containing all the information needed to mount the volume, - except for passwords. - - volRefNum --> Volume specification. - volMountInfo <-- The volume mounting information. - - __________ - - Also see: FSGetVolMountInfoSize, VolumeMount -*/ - -/*****************************************************************************/ - -#pragma mark FSVolumeMount - -OSErr -FSVolumeMount( - const void *volMountInfo, - FSVolumeRefNum *volRefNum); - -/* - The VolumeMount function mounts a volume using a volume mounting - information record. - - volMountInfo --> A volume mounting information record. - volRefNum <-- The volume reference number. - - __________ - - Also see: FSGetVolMountInfoSize, FSGetVolMountInfo -*/ - -/*****************************************************************************/ - -#pragma mark FSMapID - -OSErr -FSMapID( - FSVolumeRefNum volRefNum, - SInt32 ugID, - SInt16 objType, - Str31 name); - -/* - The FSMapID function determines the name of a user or group if you know - the user or group ID. - - volRefNum --> Volume specification. - objType --> The mapping function code: - kOwnerID2Name to map a user ID to a user name - kGroupID2Name to map a group ID to a group name - name <** An optional pointer to a buffer (minimum Str31). - If not NULL, the user or group name - will be returned in the buffer. - - __________ - - Also see: FSGetDirAccess, FSSetDirAccess, FSMapName -*/ - -/*****************************************************************************/ - -#pragma mark FSMapName - -OSErr -FSMapName( - FSVolumeRefNum volRefNum, - ConstStr255Param name, - SInt16 objType, - SInt32 *ugID); - -/* - The FSMapName function determines the user or group ID if you know the - user or group name. - - volRefNum --> Volume specification. - name --> The user or group name. - objType --> The mapping function code: - kOwnerName2ID to map a user name to a user ID - kGroupName2ID to map a user name to a group ID - ugID <-- The user or group ID. - - __________ - - Also see: FSGetDirAccess, FSSetDirAccess, FSMapID -*/ - -/*****************************************************************************/ - -#pragma mark FSCopyFile - -OSErr -FSCopyFile( - const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - UniCharCount nameLength, - const UniChar *copyName, /* can be NULL (no rename during copy) */ - TextEncoding textEncodingHint, - FSRef *newRef); /* can be NULL */ - -/* - The FSCopyFile function duplicates a file and optionally renames it. - The source and destination volumes must be on the same file server. - This function instructs the server to copy the file. - - srcFileRef --> An FSRef specifying the source file. - dstDirectoryRef --> An FSRef specifying the destination directory. - nameLength --> Number of UniChar in copyName parameter (ignored - if copyName is NULL). - copyName --> Points to the new file name if the file is to be - renamed, or NULL if the file isn't to be renamed. - textEncodingHint --> The text encoding hint used for the rename. - You can pass kTextEncodingUnknown to use the - "default" textEncodingHint. - newRef <** An optional pointer to a FSRef. - If not NULL, the FSRef of the duplicated file - will be returned in the FSRef. -*/ - -/*****************************************************************************/ - -#pragma mark FSMoveRename - -OSErr -FSMoveRename( - const FSRef *srcFileRef, - const FSRef *dstDirectoryRef, - UniCharCount nameLength, - const UniChar *moveName, /* can be NULL (no rename during move) */ - TextEncoding textEncodingHint, - FSRef *newRef); /* can be NULL */ - -/* - The FSMoveRename function moves a file or directory (object), and - optionally renames it. The source and destination locations must be on - the same shared volume. - - srcFileRef --> An FSRef specifying the source file. - dstDirectoryRef --> An FSRef specifying the destination directory. - nameLength --> Number of UniChar in moveName parameter (ignored - if copyName is NULL) - moveName --> Points to the new object name if the object is to be - renamed, or NULL if the object isn't to be renamed. - textEncodingHint --> The text encoding hint used for the rename. - You can pass kTextEncodingUnknown to use the - "default" textEncodingHint. - newRef <** An optional pointer to a FSRef. - If not NULL, the FSRef of the moved object - will be returned in the FSRef. -*/ - -/*****************************************************************************/ - -#pragma mark ----- File ID Routines ----- - -/*****************************************************************************/ - -#pragma mark FSResolveFileIDRef - -OSErr -FSResolveFileIDRef( - FSVolumeRefNum volRefNum, - SInt32 fileID, - FSRef *ref); - -/* - The FSResolveFileIDRef function returns an FSRef for the file with the - specified file ID reference. - - volRefNum --> Volume specification. - fileID --> The file ID reference. - ref <-- The FSRef for the file ID reference. - - __________ - - Also see: FSCreateFileIDRef, FSDeleteFileIDRef -*/ - -/*****************************************************************************/ - -#pragma mark FSCreateFileIDRef - -OSErr -FSCreateFileIDRef( - const FSRef *ref, - SInt32 *fileID); - -/* - The FSCreateFileIDRef function creates a file ID reference for the - specified file, or if a file ID reference already exists, supplies - the file ID reference and returns the result code fidExists or afpIDExists. - - ref --> The FSRef for the file. - fileID <-- The file ID reference (if result is noErr, - fidExists, or afpIDExists). - - __________ - - Also see: GetFSRefFromFileIDRef, FSDeleteFileIDRef -*/ - -/*****************************************************************************/ - -#pragma mark FSDeleteFileIDRef - -/* - Why is there no FSDeleteFileIDRef routine? There are two reasons: - - 1. Since Mac OS 8.1, PBDeleteFileIDRef hasn't deleted file ID references. - On HFS volumes, deleting a file ID reference breaks aliases (which - use file ID references to track files as they are moved around on a - volume) and file ID references are automatically deleted when the file - they refer to is deleted. On HFS Plus volumes, file ID references are - always created when a file is created, deleted when the file is deleted, - and cannot be deleted at any other time. - - 2. PBDeleteFileIDRef causes a memory access fault under Mac OS X 10.0 - through 10.1.x. While this will be fixed in a future release, the - implementation, like the Mac OS 8/9 implementation, does not delete - file ID references. - - __________ - - Also see: GetFSRefFromFileIDRef, FSCreateFileIDRef -*/ - -/*****************************************************************************/ - -#pragma mark ----- Utility Routines ----- - -/*****************************************************************************/ - -#pragma mark GetTempBuffer - -Ptr -GetTempBuffer( - ByteCount buffReqSize, - ByteCount *buffActSize); - -/* - The GetTempBuffer function allocates a temporary buffer for file system - operations which is at least 4K bytes and a multiple of 4K bytes. - - buffReqSize --> Size you'd like the buffer to be. - buffActSize <-- The size of the buffer allocated. - function result <-- Pointer to memory allocated, or NULL if no memory - was available. The caller is responsible for - disposing of this buffer with DisposePtr. -*/ - -/*****************************************************************************/ - -#pragma mark FileRefNumGetFSRef - -OSErr -FileRefNumGetFSRef( - short refNum, - FSRef *ref); - -/* - The FileRefNumGetFSRef function gets the FSRef of an open file. - - refNum --> The file reference number of an open file. - ref <-- The FSRef to the open file. -*/ - -/*****************************************************************************/ - -#pragma mark FSSetDefault - -OSErr -FSSetDefault( - const FSRef *newDefault, - FSRef *oldDefault); - -/* - The FSSetDefault function sets the current working directory to the - directory specified by newDefault. The previous current working directory - is returned in oldDefault and must be used to restore the current working - directory to its previous state with the FSRestoreDefault function. - These two functions are designed to be used as a wrapper around - Standard I/O routines where the location of the file is implied to be the - current working directory. This is how you should use these functions: - - result = FSSetDefault(&newDefault, &oldDefault); - if ( noErr == result ) - { - // call the Stdio functions like remove, rename, - // fopen, freopen, etc here! - - result = FSRestoreDefault(&oldDefault); - } - - newDefault --> An FSRef that specifies the new current working - directory. - oldDefault <-- The previous current working directory's FSRef. - - __________ - - Also see: FSRestoreDefault -*/ - -/*****************************************************************************/ - -#pragma mark FSRestoreDefault - -OSErr -FSRestoreDefault( - const FSRef *oldDefault); - -/* - The FSRestoreDefault function restores the current working directory - to the directory specified by oldDefault. The oldDefault parameter was - previously obtained from the FSSetDefault function. - These two functions are designed to be used as a wrapper around - Standard I/O routines where the location of the file is implied to be the - current working directory. This is how you should use these functions: - - result = FSSetDefault(&newDefault, &oldDefault); - if ( noErr == result ) - { - // call the Stdio functions like remove, rename, - // fopen, freopen, etc here! - - result = FSRestoreDefault(&oldDefault); - } - - oldDefault --> The FSRef of the location to restore. - - __________ - - Also see: FSSetDefault -*/ - -/*****************************************************************************/ - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=reset -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(pop) -#elif PRAGMA_STRUCT_PACK - #pragma pack() -#endif - -#ifdef PRAGMA_IMPORT_OFF -#pragma import off -#elif PRAGMA_IMPORT -#pragma import reset -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __MOREFILESX__ */ - - diff --git a/Source/OpenGL_Full_Screen.cpp b/Source/OpenGL_Full_Screen.cpp deleted file mode 100644 index bbd3696..0000000 --- a/Source/OpenGL_Full_Screen.cpp +++ /dev/null @@ -1,1793 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#include "Game.h" -#include "nommgr.h" - -extern bool buttons[3]; -extern float multiplier; -extern float screenwidth,screenheight; -extern float sps; -extern float realmultiplier; -extern int slomo; -extern bool ismotionblur; -extern float usermousesensitivity; -extern int detail; -extern bool floatjump; -extern bool cellophane; -extern int terraindetail; -extern int texdetail; -extern int bloodtoggle; -extern bool osx; -extern bool autoslomo; -extern bool foliage; -extern bool musictoggle; -extern bool trilinear; -extern float gamespeed; -extern int difficulty; -extern bool damageeffects; -extern int numplayers; -extern bool decals; -extern bool invertmouse; -extern bool texttoggle; -extern bool ambientsound; -extern bool mousejump; -extern bool freeze; -extern Person player[maxplayers]; -extern bool vblsync; -extern bool stillloading; -extern bool showpoints; -extern bool alwaysblur; -extern bool immediate; -extern bool velocityblur; -extern bool debugmode; -extern int mainmenu; -extern int kBitsPerPixel; -extern float slomospeed; -extern float slomofreq; -extern float oldgamespeed; - - #define kUseAGLFullScreenX 1 - #define kUseFades 1 - -// system includes ---------------------------------------------------------- - -#ifdef __APPLE_CC__ - #include "Carbon Include.h" - #include - - #include - #include - #include - #include - #include -#else - #include - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - // profile - #include - - #include "agl.h" - #include "gamegl.h" - #include "glu.h" -#endif - -#include -#include -#include -#include -#include - -// project includes --------------------------------------------------------- - -#include "aglString.h" -#include "MacInput.h" - -// functions (internal/private) --------------------------------------------- - -static UInt32 CheckMacOSX (void); -void CToPStr (StringPtr outString, const char *inString); -void ReportError (char * strError); -OSStatus DSpDebugStr (OSStatus error); -GLenum aglDebugStr (void); -GLenum glDebugStr (void); - -CGrafPtr SetupDSpFullScreen (GDHandle hGD); -void ShutdownDSp (CGrafPtr pDSpPort); - -AGLContext SetupAGL (GDHandle hGD, AGLDrawable win); -AGLContext SetupAGLFullScreen (GDHandle display, short * pDepth, short * pWidth, short * pHeight); -void CleanupAGL (AGLContext ctx); -void DrawGL (Rect * pRectPort); - -void InitToolbox(void); -void CreateGLWindow (void); -Boolean SetUp (void); -void DoMenu (SInt32 menuResult); -void DoKey (SInt8 theKey, SInt8 theCode); -void DoUpdate (void); - -pascal void IdleTimer (EventLoopTimerRef inTimer, void* userData); -EventLoopTimerUPP GetTimerUPP (void); -static Boolean RunningOnCarbonX(void); - -void DoEvent (void); -void CleanUp (void); - -// profile wrappers -Boolean WaitNextEventWrapper (EventMask eventMask, EventRecord *theEvent, unsigned long sleep,RgnHandle mouseRgn); -OSStatus DSpProcessEventWrapper (EventRecord *inEvent, Boolean *outEventWasProcessed); -void UpdateWrapper (EventRecord *theEvent); - -// statics/globals (internal only) ------------------------------------------ - -Point delta; - -// Menu defs -enum -{ - kMenuApple = 128, - kMenuFile = 129, - - kAppleAbout = 1, - kFileQuit = 1 -}; - -enum -{ - kForegroundSleep = 10, - kBackgroundSleep = 10000 -}; -EventLoopTimerRef gTimer = NULL; - -int kContextWidth; -int kContextHeight; - -const RGBColor rgbBlack = { 0x0000, 0x0000, 0x0000 }; - -NumVersion gVersionDSp; -DSpContextAttributes gContextAttributes; -DSpContextReference gContext = 0; -extern AGLContext gaglContext; -GLuint gFontList; -char gcstrMode [256] = ""; - -AGLDrawable gpDSpPort = NULL; // will be NULL for full screen under X -Rect gRectPort = {0, 0, 0, 0}; - -UInt32 gSleepTime = kForegroundSleep; -Boolean gDone = false, gfFrontProcess = true; - -Game game; - -// profile -#if __profile__ -OSErr gProfErr = noErr; -#endif - -#pragma mark - - -//----------------------------------------------------------------------------------------------------------------------- - -// are we running on Mac OS X -// returns 0 if < Mac OS X or version number of Mac OS X (10.0 for GM) - -static UInt32 CheckMacOSX (void) -{ - UInt32 response; - - if ((Gestalt(gestaltSystemVersion, (SInt32 *) &response) == noErr) && (response >= 0x01000)) - return response; - else - return 0; -} - -//----------------------------------------------------------------------------------------------------------------------- - -// Copy C string to Pascal string - -void CToPStr (StringPtr outString, const char *inString) -{ - unsigned char x = 0; - do - *(((char*)outString) + x + 1) = *(inString + x++); - while ((*(inString + x) != 0) && (x < 256)); - *((char*)outString) = (char) x; -} - -// -------------------------------------------------------------------------- - -void ReportError (char * strError) -{ - char errMsgCStr [256]; - Str255 strErr; - - sprintf (errMsgCStr, "%s", strError); - - // out as debug string - CToPStr (strErr, errMsgCStr); - DebugStr (strErr); -} - -//----------------------------------------------------------------------------------------------------------------------- - -OSStatus DSpDebugStr (OSStatus error) -{ - switch (error) - { - case noErr: - break; - case kDSpNotInitializedErr: - ReportError ("DSp Error: Not initialized"); - break; - case kDSpSystemSWTooOldErr: - ReportError ("DSp Error: system Software too old"); - break; - case kDSpInvalidContextErr: - ReportError ("DSp Error: Invalid context"); - break; - case kDSpInvalidAttributesErr: - ReportError ("DSp Error: Invalid attributes"); - break; - case kDSpContextAlreadyReservedErr: - ReportError ("DSp Error: Context already reserved"); - break; - case kDSpContextNotReservedErr: - ReportError ("DSp Error: Context not reserved"); - break; - case kDSpContextNotFoundErr: - ReportError ("DSp Error: Context not found"); - break; - case kDSpFrameRateNotReadyErr: - ReportError ("DSp Error: Frame rate not ready"); - break; - case kDSpConfirmSwitchWarning: -// ReportError ("DSp Warning: Must confirm switch"); // removed since it is just a warning, add back for debugging - return 0; // don't want to fail on this warning - break; - case kDSpInternalErr: - ReportError ("DSp Error: Internal error"); - break; - case kDSpStereoContextErr: - ReportError ("DSp Error: Stereo context"); - break; - } - return error; -} - -//----------------------------------------------------------------------------------------------------------------------- - -// if error dump agl errors to debugger string, return error - -GLenum aglDebugStr (void) -{ - GLenum err = aglGetError(); - if (AGL_NO_ERROR != err) - ReportError ((char *)aglErrorString(err)); - return err; -} - -//----------------------------------------------------------------------------------------------------------------------- - -// if error dump agl errors to debugger string, return error - -GLenum glDebugStr (void) -{ - GLenum err = glGetError(); - if (GL_NO_ERROR != err) - ReportError ((char *)gluErrorString(err)); - return err; -} - -#pragma mark - -//----------------------------------------------------------------------------------------------------------------------- - -// Set up DSp screen on graphics device requested -// side effect: sets both gpDSpWindow and gpPort - -CGrafPtr SetupDSpFullScreen (GDHandle hGD) -{ - DSpContextAttributes foundAttributes; - DisplayIDType displayID = NULL; - - if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) DSpGetVersion) - { - ReportError ("DrawSprocket not installed."); - return NULL; - } - else - gVersionDSp = DSpGetVersion (); - - if ((gVersionDSp.majorRev == 0x01) && (gVersionDSp.minorAndBugRev < 0x99)) - { - // this version of DrawSprocket is not completely functional on Mac OS X - if (CheckMacOSX ()) - { - ReportError ("DrawSprocket 1.99 or greate required on Mac OS X, please update to at least Mac OS X 10.1."); - return NULL; - } - } - - // Note: DSp < 1.7.3 REQUIRES the back buffer attributes even if only one buffer is required - memset(&gContextAttributes, 0, sizeof (DSpContextAttributes)); - gContextAttributes.displayWidth = kContextWidth; - gContextAttributes.displayHeight = kContextHeight; - gContextAttributes.colorNeeds = kDSpColorNeeds_Require; - gContextAttributes.displayBestDepth = kBitsPerPixel; - gContextAttributes.backBufferBestDepth = kBitsPerPixel; - gContextAttributes.displayDepthMask = kDSpDepthMask_All; - gContextAttributes.backBufferDepthMask = kDSpDepthMask_All; - gContextAttributes.pageCount = 1; // only the front buffer is needed - - screenwidth=kContextWidth; - screenheight=kContextHeight; - - DMGetDisplayIDByGDevice (hGD, &displayID, true); - - if (noErr != DSpDebugStr (DSpFindBestContextOnDisplayID (&gContextAttributes, &gContext, displayID))) - { - ReportError ("DSpFindBestContext() had an error."); - return NULL; - } - - if (noErr != DSpDebugStr (DSpContext_GetAttributes (gContext, &foundAttributes))) // see what we actually found - { - ReportError ("DSpContext_GetAttributes() had an error."); - return NULL; - } - - // reset width and height to full screen and handle our own centering - // HWA will not correctly center less than full screen size contexts - gContextAttributes.displayWidth = foundAttributes.displayWidth; - gContextAttributes.displayHeight = foundAttributes.displayHeight; - gContextAttributes.pageCount = 1; // only the front buffer is needed - gContextAttributes.contextOptions = 0 | kDSpContextOption_DontSyncVBL; // no page flipping and no VBL sync needed - - DSpSetBlankingColor(&rgbBlack); - - if (noErr != DSpDebugStr (DSpContext_Reserve ( gContext, &gContextAttributes))) // reserve our context - { - ReportError ("DSpContext_Reserve() had an error."); - return NULL; - } - - HideCursor (); - - if (noErr != DSpDebugStr (DSpContext_SetState (gContext, kDSpContextState_Active))) // activate our context - { - ReportError ("DSpContext_SetState() had an error."); - return NULL; - } - - - if ((CheckMacOSX ()) && !((gVersionDSp.majorRev > 0x01) || ((gVersionDSp.majorRev == 0x01) && (gVersionDSp.minorAndBugRev >= 0x99))))// DSp should be supported in version after 1.98 - { - ReportError ("Mac OS X with DSp < 1.99 does not support DrawSprocket for OpenGL full screen"); - return NULL; - } - else if (CheckMacOSX ()) // DSp should be supported in versions 1.99 and later - { - CGrafPtr pPort; - // use DSp's front buffer on Mac OS X - if (noErr != DSpDebugStr (DSpContext_GetFrontBuffer (gContext, &pPort))) - { - ReportError ("DSpContext_GetFrontBuffer() had an error."); - return NULL; - } - // there is a problem in Mac OS X 10.0 GM CoreGraphics that may not size the port pixmap correctly - // this will check the vertical sizes and offset if required to fix the problem - // this will not center ports that are smaller then a particular resolution - { - long deltaV, deltaH; - Rect portBounds; - PixMapHandle hPix = GetPortPixMap (pPort); - Rect pixBounds = (**hPix).bounds; - GetPortBounds (pPort, &portBounds); - deltaV = (portBounds.bottom - portBounds.top) - (pixBounds.bottom - pixBounds.top) + - (portBounds.bottom - portBounds.top - kContextHeight) / 2; - deltaH = -(portBounds.right - portBounds.left - kContextWidth) / 2; - if (deltaV || deltaH) - { - GrafPtr pPortSave; - GetPort (&pPortSave); - SetPort ((GrafPtr)pPort); - // set origin to account for CG offset and if requested drawable smaller than screen rez - SetOrigin (deltaH, deltaV); - SetPort (pPortSave); - } - } - return pPort; - } - else // Mac OS 9 or less - { - WindowPtr pWindow; - Rect rectWin; - RGBColor rgbSave; - GrafPtr pGrafSave; - // create a new window in our context - // note: OpenGL is expecting a window so it can enumerate the devices it spans, - // center window in our context's gdevice - rectWin.top = (short) ((**hGD).gdRect.top + ((**hGD).gdRect.bottom - (**hGD).gdRect.top) / 2); // h center - rectWin.top -= (short) (kContextHeight / 2); - rectWin.left = (short) ((**hGD).gdRect.left + ((**hGD).gdRect.right - (**hGD).gdRect.left) / 2); // v center - rectWin.left -= (short) (kContextWidth / 2); - rectWin.right = (short) (rectWin.left + kContextWidth); - rectWin.bottom = (short) (rectWin.top + kContextHeight); - - pWindow = NewCWindow (NULL, &rectWin, "\p", 0, plainDBox, (WindowPtr)-1, 0, 0); - - // paint back ground black before fade in to avoid white background flash - ShowWindow(pWindow); - GetPort (&pGrafSave); - SetPortWindowPort (pWindow); - GetForeColor (&rgbSave); - RGBForeColor (&rgbBlack); - { - Rect paintRect; - GetWindowPortBounds (pWindow, &paintRect); - PaintRect (&paintRect); - } - RGBForeColor (&rgbSave); // ensure color is reset for proper blitting - SetPort (pGrafSave); - return (GetWindowPort (pWindow)); - } -} - -//----------------------------------------------------------------------------------------------------------------------- - -// clean up DSp - -void ShutdownDSp (CGrafPtr pDSpPort) -{ - if ((NULL != pDSpPort) && !CheckMacOSX ()) - DisposeWindow (GetWindowFromPort (pDSpPort)); - DSpContext_SetState( gContext, kDSpContextState_Inactive); - DSpContext_Release (gContext); -} - -#pragma mark - -//----------------------------------------------------------------------------------------------------------------------- - -// OpenGL Setup - - -AGLContext SetupAGL (GDHandle hGD, AGLDrawable drawable) -{ - GLint attrib[64]; - - AGLPixelFormat fmt; - AGLContext ctx; - -// different possible pixel format choices for different renderers -// basics requirements are RGBA and double buffer -// OpenGLz will select acclerated context if available - - short i = 0; - attrib [i++] = AGL_RGBA; // red green blue and alpha - attrib [i++] = AGL_DOUBLEBUFFER; // double buffered - attrib [i++] = AGL_DEPTH_SIZE; - attrib [i++] = 8; - attrib [i++] = AGL_ACCELERATED; // HWA pixel format only - attrib [i++] = AGL_NONE; - - if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) aglChoosePixelFormat) // check for existance of OpenGL - { - ReportError ("OpenGL not installed"); - return NULL; - } - - if (hGD) - fmt = aglChoosePixelFormat (&hGD, 1, attrib); // get an appropriate pixel format - else - fmt = aglChoosePixelFormat(NULL, 0, attrib); // get an appropriate pixel format - aglDebugStr (); - if (NULL == fmt) - { - ReportError("Could not find valid pixel format"); - return NULL; - } - - ctx = aglCreateContext (fmt, NULL); // Create an AGL context - aglDebugStr (); - if (NULL == ctx) - { - ReportError ("Could not create context"); - return NULL; - } - - if (!aglSetDrawable (ctx, drawable)) // attach the window to the context - { - ReportError ("SetDrawable failed"); - aglDebugStr (); - return NULL; - } - - - if (!aglSetCurrentContext (ctx)) // make the context the current context - { - aglDebugStr (); - aglSetDrawable (ctx, NULL); - return NULL; - } - - aglDestroyPixelFormat(fmt); // pixel format is no longer needed - - return ctx; -} - -//----------------------------------------------------------------------------------------------------------------------- - -// OpenGL Setup - -AGLContext SetupAGLFullScreen (GDHandle display, short * pDepth, short * pWidth, short * pHeight) -{ - //GLint attrib[64]; - GLint attrib[] ={AGL_RGBA, AGL_DOUBLEBUFFER,AGL_DEPTH_SIZE, 16, AGL_FULLSCREEN,AGL_ALL_RENDERERS, AGL_NONE}; - - AGLPixelFormat fmt; - AGLContext ctx; - - - if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) aglChoosePixelFormat) // check for existance of OpenGL - { - ReportError ("OpenGL not installed"); - return NULL; - } - - fmt = aglChoosePixelFormat(&display, 1, attrib); // this may fail if looking for acclerated across multiple monitors - if (NULL == fmt) - { - ReportError("Could not find valid pixel format"); - aglDebugStr (); - return NULL; - } - - ctx = aglCreateContext (fmt, NULL); // Create an AGL context - if (NULL == ctx) - { - ReportError ("Could not create context"); - aglDebugStr (); - return NULL; - } - - if (!aglSetFullScreen (ctx, *pWidth, *pHeight, 60, 0)) - { - ReportError ("SetFullScreen failed"); - aglDebugStr (); - return NULL; - } - - if (!aglSetCurrentContext (ctx)) // make the context the current context - { - ReportError ("SetCurrentContext failed"); - aglDebugStr (); - aglSetDrawable (ctx, NULL); // turn off full screen - return NULL; - } - - aglDestroyPixelFormat(fmt); // pixel format is no longer needed - - return ctx; -} - -//----------------------------------------------------------------------------------------------------------------------- - -// OpenGL Cleanup - -void CleanupAGL(AGLContext ctx) -{ - aglSetDrawable (ctx, NULL); - aglSetCurrentContext (NULL); - aglDestroyContext (ctx); -} - -//----------------------------------------------------------------------------------------------------------------------- - -// OpenGL Drawing - -void DrawGL (Rect * pRectPort) -{ - if (gaglContext == 0) - return; - aglSetCurrentContext (gaglContext); // ensure our context is current prior to drawing - - { - GLint width = pRectPort->right - pRectPort->left; - GLint height = pRectPort->bottom - pRectPort->top; - screenwidth=width; - screenheight=height; - /* glViewport ((width - (width * 1)) / 2, (height - (height * 1)) / 2, - width * 1, height * 1);*/ - } - - game.DrawGLScene(); - - - //glDebugStr (); - - // draw info - /*{ - GLint matrixMode; - glViewport (0, 0, pRectPort->right - pRectPort->left, pRectPort->bottom - pRectPort->top); - glGetIntegerv (GL_MATRIX_MODE, &matrixMode); - glMatrixMode (GL_PROJECTION); - glPushMatrix(); - glLoadIdentity (); - glMatrixMode (GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity (); - glScalef (2.0 / (pRectPort->right - pRectPort->left), -2.0 / (pRectPort->bottom - pRectPort->top), 1.0); - glTranslatef (-(pRectPort->right - pRectPort->left) / 2.0, -(pRectPort->bottom - pRectPort->top) / 2.0, 0.0); - glColor3f (1.0, 1.0, 1.0); - glRasterPos3d (10, 12, 0); - DrawFrameRate (gFontList); - glRasterPos3d (10, 24, 0); - DrawCStringGL (gcstrMode, gFontList); - glRasterPos3d (10, (pRectPort->bottom - pRectPort->top) - 15, 0); - DrawCStringGL ((char*) glGetString (GL_VENDOR), gFontList); - glRasterPos3d (10, (pRectPort->bottom - pRectPort->top) - 3, 0); - DrawCStringGL ((char*) glGetString (GL_RENDERER), gFontList); - static char aChar[256] = ""; - sprintf (aChar, " Mac OS X: %d", RunningOnCarbonX()); - DrawCStringGL (aChar, gFontList); - glPopMatrix(); - glMatrixMode (GL_PROJECTION); - glPopMatrix(); - glMatrixMode (matrixMode); - }*/ - //glDebugStr (); - //aglSwapBuffers(gaglContext); // send swap command -} - -#pragma mark - -//----------------------------------------------------------------------------------------------------------------------- - -static pascal OSErr QuitAppleEventHandler( const AppleEvent *appleEvt, AppleEvent* reply, SInt32 refcon ) -{ - #pragma unused (appleEvt, reply, refcon) - //gDone = true; - game.tryquit=1; - return false; -} - -//----------------------------------------------------------------------------------------------------------------------- - -void InitToolbox(void) -{ - OSErr err; - long response; - MenuHandle menu; - - InitCursor(); - -// profile -#if __profile__ -// prototype: -// ProfilerInit (collection method, time base, num funcs, stack depth) - // default call - gProfErr = ProfilerInit (collectDetailed, bestTimeBase, 20, 10); // set up profiling - // something that you may need to do (may need more memory) -// gProfErr = ProfilerInit (collectSummary, bestTimeBase, 1000, 100); // set up profiling -// Note: application will likely run slower, but still should be useful info - if (noErr == gProfErr) - ProfilerSetStatus(FALSE); -#endif - - // Init Menus - menu = NewMenu (kMenuApple, "\p\024"); // new apple menu - InsertMenu (menu, 0); // add menu to end - - menu = NewMenu (kMenuFile, "\pFile"); // new menu - InsertMenu (menu, 0); // add menu to end - - // insert application menus here - - // add quit if not under Mac OS X - err = Gestalt (gestaltMenuMgrAttr, &response); - if ((err == noErr) && !(response & gestaltMenuMgrAquaLayoutMask)) - AppendMenu (menu, "\pQuit/Q"); // add quit - - DrawMenuBar(); - err = AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(QuitAppleEventHandler), 0, false ); - if (err != noErr) - ExitToShell(); -} - -// -------------------------------------------------------------------------- - -static Point gMidPoint; - -Boolean SetUp (void) -{ - char string[10]; - - SetQDGlobalsRandomSeed(TickCount()); - - osx = 0; - if(CheckMacOSX ())osx = 1; - ifstream ipstream(":Data:config.txt"); - detail=1; - ismotionblur=0; - usermousesensitivity=1; - kContextWidth=640; - kContextHeight=480; - kBitsPerPixel = 32; - floatjump=0; - cellophane=0; - texdetail=4; - autoslomo=1; - decals=1; - invertmouse=0; - bloodtoggle=0; - terraindetail=2; - foliage=1; - musictoggle=1; - trilinear=1; - gamespeed=1; - difficulty=1; - damageeffects=0; - texttoggle=1; - alwaysblur=0; - showpoints=0; - immediate=0; - velocityblur=0; - slomospeed=0.25; - slomofreq=8012; - - game.crouchkey=MAC_SHIFT_KEY; - game.jumpkey=MAC_SPACE_KEY; - game.leftkey=MAC_A_KEY; - game.forwardkey=MAC_W_KEY; - game.backkey=MAC_S_KEY; - game.rightkey=MAC_D_KEY; - game.drawkey=MAC_E_KEY; - game.throwkey=MAC_Q_KEY; - game.attackkey=MAC_MOUSEBUTTON1; - game.chatkey=MAC_T_KEY; - numplayers=1; - ambientsound=1; - vblsync=0; - debugmode=0; - if(!ipstream) { - ofstream opstream(":Data:config.txt"); - opstream << "Screenwidth:\n"; - opstream << kContextWidth; - opstream << "\nScreenheight:\n"; - opstream << kContextHeight; - opstream << "\nMouse sensitivity:\n"; - opstream << usermousesensitivity; - opstream << "\nBlur(0,1):\n"; - opstream << ismotionblur; - opstream << "\nOverall Detail(0,1,2) higher=better:\n"; - opstream << detail; - opstream << "\nFloating jump:\n"; - opstream << floatjump; - opstream << "\nMouse jump:\n"; - opstream << mousejump; - opstream << "\nAmbient sound:\n"; - opstream << ambientsound; - opstream << "\nBlood (0,1,2):\n"; - opstream << bloodtoggle; - opstream << "\nAuto slomo:\n"; - opstream << autoslomo; - opstream << "\nFoliage:\n"; - opstream << foliage; - opstream << "\nMusic:\n"; - opstream << musictoggle; - opstream << "\nTrilinear:\n"; - opstream << trilinear; - opstream << "\nDecals(shadows,blood puddles,etc):\n"; - opstream << decals; - opstream << "\nInvert mouse:\n"; - opstream << invertmouse; - opstream << "\nGamespeed:\n"; - opstream << gamespeed; - opstream << "\nDifficulty(0,1,2) higher=harder:\n"; - opstream << difficulty; - opstream << "\nDamage effects(blackout, doublevision):\n"; - opstream << damageeffects; - opstream << "\nText:\n"; - opstream << texttoggle; - opstream << "\nDebug:\n"; - opstream << debugmode; - opstream << "\nVBL Sync:\n"; - opstream << vblsync; - opstream << "\nShow Points:\n"; - opstream << showpoints; - opstream << "\nAlways Blur:\n"; - opstream << alwaysblur; - opstream << "\nImmediate mode (turn on on G5):\n"; - opstream << immediate; - opstream << "\nVelocity blur:\n"; - opstream << velocityblur; - opstream << "\nForward key:\n"; - opstream << KeyToChar(game.forwardkey); - opstream << "\nBack key:\n"; - opstream << KeyToChar(game.backkey); - opstream << "\nLeft key:\n"; - opstream << KeyToChar(game.leftkey); - opstream << "\nRight key:\n"; - opstream << KeyToChar(game.rightkey); - opstream << "\nJump key:\n"; - opstream << KeyToChar(game.jumpkey); - opstream << "\nCrouch key:\n"; - opstream << KeyToChar(game.crouchkey); - opstream << "\nDraw key:\n"; - opstream << KeyToChar(game.drawkey); - opstream << "\nThrow key:\n"; - opstream << KeyToChar(game.throwkey); - opstream << "\nAttack key:\n"; - opstream << KeyToChar(game.attackkey); - opstream << "\nChat key:\n"; - opstream << KeyToChar(game.chatkey); - opstream.close(); - } - if(ipstream){ - ipstream.ignore(256,'\n'); - ipstream >> kContextWidth; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> kContextHeight; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> usermousesensitivity; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> ismotionblur; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> detail; - if(detail!=0)kBitsPerPixel=32; - else kBitsPerPixel=16; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> floatjump; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> mousejump; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> ambientsound; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> bloodtoggle; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> autoslomo; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> foliage; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> musictoggle; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> trilinear; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> decals; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> invertmouse; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> gamespeed; - oldgamespeed=gamespeed; - if(oldgamespeed==0){ - gamespeed=1; - oldgamespeed=1; - } - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> difficulty; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> damageeffects; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> texttoggle; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> debugmode; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> vblsync; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> showpoints; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> alwaysblur; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> immediate; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> velocityblur; - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.forwardkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.backkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.leftkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.rightkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.jumpkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.crouchkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.drawkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.throwkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.attackkey=CharToKey(string); - ipstream.ignore(256,'\n'); - ipstream.ignore(256,'\n'); - ipstream >> string; - game.chatkey=CharToKey(string); - ipstream.close(); - - if(detail>2)detail=2; - if(detail<0)detail=0; - if(screenwidth<0)screenwidth=640; - if(screenheight<0)screenheight=480; -#if !USE_SDL // we'll take anything that works. - if(screenwidth>3000)screenwidth=640; - if(screenheight>3000)screenheight=480; -#endif - } - - - if(vblsync){ - GLint swapInt = 1; - aglSetInteger(gaglContext, AGL_SWAP_INTERVAL, &swapInt); - } - - if(kBitsPerPixel!=32&&kBitsPerPixel!=16){ - kBitsPerPixel=16; - } - - - GDHandle hGD, hTargetDevice = NULL; - short numDevices = 0; - short fNum = 0; - short whichDevice = 0; // number of device to try (0 = 1st device) - - InitToolbox (); - - gpDSpPort = NULL; - gaglContext = 0; - - // check for DSp - if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) DSpStartup) - ReportError ("DSp not installed"); - - if (noErr != DSpDebugStr (DSpStartup())) - return NULL; -// DSpSetDebugMode (true); -#if defined kUseFades - DSpDebugStr (DSpContext_FadeGammaOut (NULL, NULL)); // fade display, remove for debug -#endif - - hGD = DMGetFirstScreenDevice (true); // check number of screens - hTargetDevice = hGD; // default to first device - do - { - if (numDevices == whichDevice) - hTargetDevice = hGD; // if device number matches - numDevices++; - hGD = DMGetNextScreenDevice (hGD, true); - } - while (hGD); - -#if defined (kUseAGLFullScreenX) - if (CheckMacOSX ()) // Try AGL full screen on Mac OS X - { - short depth = kBitsPerPixel, width = kContextWidth, height = kContextHeight; - gaglContext = SetupAGLFullScreen (hTargetDevice, &depth, &width, &height); // Setup the OpenGL context - SetRect (&gRectPort, 0, 0, width, height); // l, t, r, b - sprintf (gcstrMode, "AGL Full Screen: %d x %d x %d", width, height, depth); - } -#endif - if (!gaglContext) //try DSp - { - if (NULL != (gpDSpPort = SetupDSpFullScreen (hTargetDevice))) // Setup DSp for OpenGL sets hTargetDeviceto device actually used - { - GetPortBounds (gpDSpPort, &gRectPort); - sprintf (gcstrMode, "DrawSprocket Full Screen: %d x %d x %d", gRectPort.right - gRectPort.left, gRectPort.bottom - gRectPort.top, (**(**hTargetDevice).gdPMap).pixelSize); - gaglContext = SetupAGL (hTargetDevice, gpDSpPort); - } - } - if (gaglContext) - { - GetFNum("\pMonaco", &fNum); // build font - gFontList = BuildFontGL (gaglContext, fNum, normal, 9); - //InstallEventLoopTimer (GetCurrentEventLoop(), 0, 0.0001, GetTimerUPP (), 0, &gTimer); - } - - //gMidPoint.h = (gRectPort.left + gRectPort.right)/2; - //gMidPoint.v = (gRectPort.top + gRectPort.bottom)/2; - gMidPoint.h = 200; - gMidPoint.v = 200; - GLint swapInt = 1; - //aglSetInteger(gaglContext, AGL_SWAP_INTERVAL, &swapInt); - -#if defined kUseFades - DSpDebugStr (DSpContext_FadeGammaIn (NULL, NULL)); -#endif - - - HideCursor(); - - - GLint width = gRectPort.right - gRectPort.left; - GLint height = gRectPort.bottom - gRectPort.top; - screenwidth=width; - screenheight=height; - - game.newdetail=detail; - game.newscreenwidth=screenwidth; - game.newscreenheight=screenheight; - - game.InitGame(); - - if (gaglContext) - return true; - else - return false; - -} - -static Boolean RunningOnCarbonX(void) -{ - static Boolean first = true; - static Boolean result = false; - - if (first) - { - UInt32 response; - - first = false; - - result = (Gestalt(gestaltSystemVersion, - (SInt32 *) &response) == noErr) - && (response >= 0x01000); - } - return result; -} - -static OSStatus LoadFrameworkBundle(CFStringRef pFrameworkCFStrRef, CFBundleRef *pFrameworkCFBndlRef) -{ - OSStatus err; - FSRef frameworksFolderRef; - CFURLRef baseURL; - CFURLRef bundleURL; - - if (nil == pFrameworkCFBndlRef) return paramErr; - - *pFrameworkCFBndlRef = nil; - - baseURL = nil; - bundleURL = nil; - - err = FSFindFolder(kOnAppropriateDisk, kFrameworksFolderType, true, &frameworksFolderRef); - if (err == noErr) { - baseURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, &frameworksFolderRef); - if (baseURL == nil) { - err = coreFoundationUnknownErr; - } - } - if (err == noErr) { - bundleURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, pFrameworkCFStrRef, false); - if (bundleURL == nil) { - err = coreFoundationUnknownErr; - } - } - if (err == noErr) { - *pFrameworkCFBndlRef = CFBundleCreate(kCFAllocatorSystemDefault, bundleURL); - if (*pFrameworkCFBndlRef == nil) { - err = coreFoundationUnknownErr; - } - } - if (err == noErr) { - if ( ! CFBundleLoadExecutable( *pFrameworkCFBndlRef ) ) { - err = coreFoundationUnknownErr; - } - } - - // Clean up. - - if (err != noErr && *pFrameworkCFBndlRef != nil) { - CFRelease(*pFrameworkCFBndlRef); - *pFrameworkCFBndlRef = nil; - } - if (bundleURL != nil) { - CFRelease(bundleURL); - } - if (baseURL != nil) { - CFRelease(baseURL); - } - - return err; -} - - - -static CFragConnectionID gCFragConnectionID = 0; - -typedef pascal OSErr (*CDM_NewDeviceProcPtr)(CursorDevicePtr * ourDevice); - -static OSErr MyCursorDeviceNewDevice(CursorDevicePtr * ourDevice) -{ - static CDM_NewDeviceProcPtr sCDM_NewDeviceProcPtr = nil; - OSStatus anErr = noErr; - - if (nil == ourDevice) return paramErr; - - if (!RunningOnCarbonX()) - { - if (!sCDM_NewDeviceProcPtr) - { - if (!gCFragConnectionID) - { - Ptr mainAddr; - Str255 errName; - - anErr = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, - kFindCFrag, &gCFragConnectionID, &mainAddr, errName); - if (noErr != anErr) return anErr; - } - - if (gCFragConnectionID) - { - CFragSymbolClass symClass; - - anErr = FindSymbol(gCFragConnectionID, "\pCrsrDevNewDevice", - (Ptr*) &sCDM_NewDeviceProcPtr, &symClass); - if (noErr != anErr) return anErr; - } - } - if (sCDM_NewDeviceProcPtr) - anErr = (*sCDM_NewDeviceProcPtr)(ourDevice); - else - anErr = paramErr; - } - - return anErr; -} - -typedef pascal OSErr (*CDM_CursorDeviceMoveToProcPtr)( - CursorDevicePtr ourDevice, - long absX, - long absY); - -typedef UInt32 (*CGWarpMouseCursorPositionProcPtr)(CGPoint newCursorPosition); -typedef UInt32 (*CGSetLocalEventsSuppressionIntervalProcPtr)(double pSeconds); - -static OSErr MyCursorDeviceMoveTo( CursorDevicePtr ourDevice, - long absX, - long absY) -{ - OSStatus anErr = noErr; - - if (RunningOnCarbonX()) - { - static CGWarpMouseCursorPositionProcPtr sCGWarpMouseCursorPositionProcPtr = nil; - - if (nil == sCGWarpMouseCursorPositionProcPtr) - { - CFBundleRef tCFBundleRef; - - anErr = LoadFrameworkBundle(CFSTR("ApplicationServices.framework"), &tCFBundleRef); - - if (noErr == anErr) - { - CGSetLocalEventsSuppressionIntervalProcPtr tCGSetLocalEventsSuppressionIntervalProcPtr = nil; - - sCGWarpMouseCursorPositionProcPtr = (CGWarpMouseCursorPositionProcPtr) - CFBundleGetFunctionPointerForName( tCFBundleRef, CFSTR("CGWarpMouseCursorPosition") ); - if (nil == sCGWarpMouseCursorPositionProcPtr) - anErr = cfragNoSymbolErr; - - tCGSetLocalEventsSuppressionIntervalProcPtr = (CGSetLocalEventsSuppressionIntervalProcPtr) - CFBundleGetFunctionPointerForName(tCFBundleRef,CFSTR("CGSetLocalEventsSuppressionInterval")); - if (nil != tCGSetLocalEventsSuppressionIntervalProcPtr) - (*tCGSetLocalEventsSuppressionIntervalProcPtr)(0.0f); - } - } - - if (nil != sCGWarpMouseCursorPositionProcPtr) - { - CGPoint tCGPoint; - - tCGPoint.x = absX; - tCGPoint.y = absY; - - (*sCGWarpMouseCursorPositionProcPtr)(tCGPoint); - } - } - else - { - static CDM_CursorDeviceMoveToProcPtr sCDM_CursorDeviceMoveToProcPtr = nil; - - if (!ourDevice) return paramErr; - - if (!sCDM_CursorDeviceMoveToProcPtr) - { - if (!gCFragConnectionID) - { - Ptr mainAddr; - Str255 errName; - - anErr = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, - kFindCFrag, &gCFragConnectionID, &mainAddr, errName); - if (noErr != anErr) return anErr; - } - - if (gCFragConnectionID) - { - CFragSymbolClass symClass; - - anErr = FindSymbol(gCFragConnectionID, "\pCrsrDevMoveTo", - (Ptr*) &sCDM_CursorDeviceMoveToProcPtr, &symClass); - if (noErr != anErr) return anErr; - } - } - if (sCDM_CursorDeviceMoveToProcPtr) - anErr = (*sCDM_CursorDeviceMoveToProcPtr)(ourDevice,absX,absY); - else - anErr = paramErr; - } - - return anErr; -} - -static void DoMouse(void) -{ - static CursorDevicePtr virtualCursorDevicePtr = nil; - OSStatus anErr = noErr; - - HideCursor(); - - if (nil == virtualCursorDevicePtr) - anErr = MyCursorDeviceNewDevice(&virtualCursorDevicePtr); - - { - static Point lastMouse = {-1,-1}; - Point globalMouse; - - GetGlobalMouse(&globalMouse); - - if (EqualPt(lastMouse, globalMouse)) - { - game.deltah=0; - game.deltav=0; - } - - if (!EqualPt(lastMouse, globalMouse)) - { - static Point virtualMouse = {0,0}; - delta = globalMouse; - - SubPt(lastMouse, &delta); - GetGlobalMouse(&lastMouse); - //AddPt(delta, &virtualMouse); - - if(mainmenu||(abs(delta.h)<10*realmultiplier*1000&&abs(delta.v)<10*realmultiplier*1000)){ - game.deltah=delta.h*usermousesensitivity; - game.deltav=delta.v*usermousesensitivity; - game.mousecoordh=globalMouse.h; - game.mousecoordv=globalMouse.v; - } -#if 1 - //printf("\nMouse Moved: {%d,%d}.",globalMouse.h,globalMouse.v); - //printf("\tdelta: {%d,%d}.",delta.h,delta.v); - //printf("\tvirtual: {%d,%d}.",virtualMouse.h,virtualMouse.v); -#endif - if(!mainmenu) - if(lastMouse.h>gMidPoint.h+100||lastMouse.hgMidPoint.v+100||lastMouse.v.6)multiplier=.6; - - game.fps=1/multiplier; - - count = multiplier*sps; - if(count<2)count=2; - //if(count>10)count=10; - - realmultiplier=multiplier; - multiplier*=gamespeed; - if(difficulty==1)multiplier*=.9; - if(difficulty==0)multiplier*=.8; - - if(game.loading==4)multiplier*=.00001; - - //multiplier*.9; - if(slomo&&!mainmenu)multiplier*=slomospeed; - //if(freeze)multiplier*=0.00001; - oldmult=multiplier; - multiplier/=(float)count; - - DoMouse(); - - game.TickOnce(); - - for(int i=0;imessage; - GetPort (&pGrafSave); - SetPort((GrafPtr) GetWindowPort(whichWindow)); - BeginUpdate(whichWindow); - DoUpdate(); - SetPort((GrafPtr) GetWindowPort(whichWindow)); - EndUpdate(whichWindow); - SetPort (pGrafSave); -} - -// -------------------------------------------------------------------------- - -pascal void IdleTimer (EventLoopTimerRef inTimer, void* userData) -{ - #pragma unused (inTimer, userData) - if(!stillloading)DoUpdate (); -} - -// -------------------------------------------------------------------------- - -EventLoopTimerUPP GetTimerUPP (void) -{ - static EventLoopTimerUPP sTimerUPP = NULL; - - if (sTimerUPP == NULL) - sTimerUPP = NewEventLoopTimerUPP (IdleTimer); - - return sTimerUPP; -} - -// -------------------------------------------------------------------------- - -pascal OSStatus mDown (EventHandlerCallRef ref, EventRef e,void * thedata) { - EventMouseButton button; - OSStatus status; - - status = GetEventParameter (e, kEventParamMouseButton, typeMouseButton, NULL, - sizeof (button), NULL, &button); - - buttons[button-1] = true; - - return eventNotHandledErr; -} - -pascal OSStatus mUp (EventHandlerCallRef ref, EventRef e,void * thedata) { - EventMouseButton button = 0; - OSStatus status; - - status = GetEventParameter (e, kEventParamMouseButton, typeMouseButton, NULL, - sizeof (EventMouseButton), NULL, &button); - - buttons[button-1] = false; - - return eventNotHandledErr; -} - -void InstallHandlers(void){ - OSStatus status; - EventTypeSpec spec; - - spec.eventClass = kEventClassMouse; - spec.eventKind = kEventMouseDown; - - status = InstallEventHandler (GetApplicationEventTarget(), - NewEventHandlerUPP (mDown), 1, &spec, NULL, NULL); - - - spec.eventKind = kEventMouseUp; - - status = InstallEventHandler (GetApplicationEventTarget(), - NewEventHandlerUPP (mUp), 1, &spec, NULL, NULL); - -} - -void NewEvent(void) { - EventRecord e; - OSStatus s; - - - /*ReceiveNextEvent (0, NULL, 1, true, &er); - - s = SendEventToEventTarget (er, GetEventDispatcherTarget());*/ - WaitNextEvent (everyEvent, &e, 0, NULL); - - DoUpdate(); -} - -void DoEvent (void) -{ - EventRecord theEvent; - WindowRef whichWindow; - SInt16 whatPart; - Boolean fProcessed; - -// profile -#if __profile__ - if (noErr == gProfErr) - ProfilerSetStatus(TRUE); // turn on profiling -#endif - - if (WaitNextEventWrapper (everyEvent, &theEvent, gSleepTime, NULL)) - { - DSpProcessEventWrapper (&theEvent, &fProcessed); - if (!fProcessed) - { - switch (theEvent.what) - { - case mouseDown: - whatPart = FindWindow (theEvent.where, &whichWindow); - switch (whatPart) - { - case inContent: -// if (GetWindowFromPort (gpDSpPort) != FrontWindow()) -// SelectWindow (GetWindowFromPort (gpDSpPort)); - break; - case inMenuBar: - { - SInt32 menuResult = MenuSelect (theEvent.where); - if (HiWord (menuResult) != 0) - DoMenu (menuResult); - } - break; - case inDrag: - { - // full screen no drag - } - break; - case inGrow: - { - // full screen no grow - } - break; - case inGoAway: - { - // full screen no go away - } - break; - case inZoomIn: - case inZoomOut: - { - // full screen no zoom - } - break; - case inSysWindow: - break; - } - break; - case keyDown: - case autoKey: - { - SInt8 theKey; - SInt8 theCode; - theKey = theEvent.message & charCodeMask; - theCode = (theEvent.message & keyCodeMask) >> 8; - if ((theEvent.modifiers & cmdKey) != 0) - { - SInt32 menuResult = MenuKey (theKey); - if (HiWord(menuResult) != 0) - DoMenu (menuResult); - } - else - DoKey (theKey, theCode); - } - break; - case updateEvt: - { - UpdateWrapper (&theEvent); - } - break; - case diskEvt: - break; - /*case osEvt: - if (theEvent.message & 0x01000000) // Suspend/resume event - { - if (theEvent.message & 0x00000001) // Resume - { - gSleepTime = kForegroundSleep; - gfFrontProcess = true; - } - else - { - gSleepTime = kBackgroundSleep; // Suspend - gfFrontProcess = false; - } - } - break;*/ - - case kHighLevelEvent: - AEProcessAppleEvent (&theEvent); - break; - } - } - } -// profile -#if __profile__ - if (noErr == gProfErr) - ProfilerSetStatus(FALSE); // turn profiling off again -#endif -} - -// -------------------------------------------------------------------------- - -void CleanUp (void) -{ - MenuHandle hMenu; - -// profile -#if __profile__ - if (noErr == gProfErr) - { - ProfilerDump ("\pGL DSp Carbon.prof"); - ProfilerTerm (); - } -#endif - - game.Dispose(); - -#if defined kUseFades - DSpDebugStr (DSpContext_FadeGammaOut (NULL, NULL)); // fade display, remove for debug -#endif - - RemoveEventLoopTimer(gTimer); - gTimer = NULL; - - DeleteFontGL (gFontList); - CleanupAGL (gaglContext); // Cleanup the OpenGL context - gaglContext = 0; - if (gpDSpPort) - { - ShutdownDSp (gpDSpPort); // DSp shutdown - gpDSpPort = NULL; - } - - - hMenu = GetMenuHandle (kMenuFile); - DeleteMenu (kMenuFile); - DisposeMenu (hMenu); - - hMenu = GetMenuHandle (kMenuApple); - DeleteMenu (kMenuApple); - DisposeMenu (hMenu); - -#if defined kUseFades - DSpDebugStr (DSpContext_FadeGammaIn (NULL, NULL)); // fade display, remove for debug -#endif - DSpShutdown (); - - ShowCursor(); -} - -// -------------------------------------------------------------------------- -#include -#include - -/*void openURL() -{ -#ifdef Q_WS_MAC - QString url("http://www.wolfire.com/"); - ICInstance icInstance - OSType psiSignature = 'Psi '; - OSStatus error = ::ICStart( &icInstance, psiSignature); - if(error=noErr){ - ConstStr255Param hint( 0x0 ); - const char* data = url.latin1(); - long length = url.length(); - long start( 0 ); - long end( length ); - ::ICLaunchURL( icInstance, hint, data, length, &start, &end); - ICStop( icInstance); - } - #endif -}*/ - -void LaunchURL(char *url) -{ - ICInstance gICInstance; - ICStart (&gICInstance, 0); - long int start,fin; - start=0; - fin=strlen(url); - ICLaunchURL(gICInstance, "\p" ,url, fin, &start, &fin); -} - - - -int main (void) -{ - try { - if (SetUp ()) { - InstallHandlers(); - while (!gDone&&!game.quit&&(!game.tryquit||!game.registered)) { - NewEvent (); - } - } - CleanUp (); - if(game.registernow){ - char url[100]; - sprintf(url,"http://www.wolfire.com/register.html"); - LaunchURL(url); - } - return 0; - } catch (const std::exception& error) { - ofstream opstream("error.txt"); - opstream << "Caught exception: " << error.what() << std::endl; - opstream.close(); - } -} diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 9afd511..1ee4964 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -19,11 +19,15 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* No need for Visual Leak Detector #ifdef WIN32 -#include +#define UINT8 WIN32API_UINT8 +#define UINT16 WIN32API_UINT16 +#define boolean WIN32API_boolean +#include +#undef UINT8 +#undef UINT16 +#undef boolean #endif -*/ #define USE_DEVIL 0 @@ -175,14 +179,24 @@ typedef struct tagPOINT { #endif #if USE_SDL + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4273) +#endif + #define GL_FUNC(ret,fn,params,call,rt) \ extern "C" { \ - static ret GLAPIENTRY (*p##fn) params = NULL; \ + static ret (GLAPIENTRY *p##fn) params = NULL; \ ret GLAPIENTRY fn params { rt p##fn call; } \ } #include "glstubs.h" #undef GL_FUNC +#ifdef _MSC_VER +#pragma warning(pop) +#endif + static bool lookup_glsym(const char *funcname, void **func) { *func = SDL_GL_GetProcAddress(funcname); @@ -222,18 +236,14 @@ void sdlGetCursorPos(POINT *pt) #define SetCursorPos(x, y) SDL_WarpMouse(x, y) #define ScreenToClient(x, pt) #define ClientToScreen(x, pt) +#ifdef MessageBox +#undef MessageBox +#endif #define MessageBox(hwnd,text,title,flags) STUBBED("msgbox") #endif Point delta; -#ifdef WIN32 -static const char g_wndClassName[]={ "LUGARUWINDOWCLASS" }; -static HINSTANCE g_appInstance; -static HWND g_windowHandle; -static HGLRC hRC; -#endif - static bool g_button, fullscreen = true; @@ -263,7 +273,7 @@ Boolean gDone = false, gfFrontProcess = true; Game * pgame = 0; -#ifndef WIN32 +#ifndef __MINGW32__ static int _argc = 0; static char **_argv = NULL; #endif @@ -287,7 +297,7 @@ bool cmdline(const char *cmd) void ReportError (char * strError) { -#ifdef WIN32 // !!! FIXME. --ryan. +#ifdef _MSC_VER // !!! FIXME. --ryan. throw std::exception( strError); #endif @@ -304,44 +314,11 @@ void ReportError (char * strError) void SetupDSpFullScreen () { -#ifdef WIN32 - LOGFUNC; - - if (fullscreen) - { - DEVMODE dmScreenSettings; - memset( &dmScreenSettings, 0, sizeof( dmScreenSettings)); - dmScreenSettings.dmSize = sizeof( dmScreenSettings); - dmScreenSettings.dmPelsWidth = kContextWidth; - dmScreenSettings.dmPelsHeight = kContextHeight; - dmScreenSettings.dmBitsPerPel = kBitsPerPixel; - dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - - // set video mode - if (ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) - { - ReportError( "Could not set display mode"); - return; - } - } - - ShowCursor(FALSE); -#endif } void ShutdownDSp () { -#ifdef WIN32 - LOGFUNC; - - if (fullscreen) - { - ChangeDisplaySettings( NULL, 0); - } - - ShowCursor(TRUE); -#endif } @@ -351,11 +328,6 @@ void ShutdownDSp () void DrawGL (Game & game) { -#ifdef WIN32 - if (hDC == 0) - return; -#endif - game.DrawGLScene(); } @@ -589,6 +561,8 @@ static void sdlEventProc(const SDL_Event &e, Game &game) ClearKey(MAC_CONTROL_KEY); if ((mod & KMOD_ALT) == 0) ClearKey(MAC_OPTION_KEY); + if ((mod & KMOD_META) == 0) + ClearKey(MAC_COMMAND_KEY); if ((mod & KMOD_SHIFT) == 0) ClearKey(MAC_SHIFT_KEY); if ((mod & KMOD_CAPS) == 0) @@ -998,115 +972,6 @@ Boolean SetUp (Game & game) if (!cmdline("nomousegrab")) SDL_WM_GrabInput(SDL_GRAB_ON); - -#elif (defined WIN32) - //------------------------------------------------------------------ - // create window - int x = 0, y = 0; - RECT r = {0, 0, kContextWidth-1, kContextHeight-1}; - DWORD dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE; - DWORD dwExStyle = WS_EX_APPWINDOW; - - if (fullscreen) - { - dwStyle |= WS_POPUP; - } - else - { - - dwStyle |= WS_OVERLAPPEDWINDOW; - dwExStyle |= WS_EX_WINDOWEDGE; - } - - AdjustWindowRectEx(&r, dwStyle, FALSE, dwExStyle); - - if (!fullscreen) - { - x = (GetSystemMetrics(SM_CXSCREEN) >> 1) - ((r.right - r.left + 1) >> 1); - y = (GetSystemMetrics(SM_CYSCREEN) >> 1) - ((r.bottom - r.top + 1) >> 1); - } - - g_windowHandle=CreateWindowEx( - dwExStyle, - g_wndClassName, "Lugaru", dwStyle, - x, y, -// kContextWidth, kContextHeight, - r.right - r.left + 1, r.bottom - r.top + 1, - NULL,NULL,g_appInstance,NULL ); - if (!g_windowHandle) - { - ReportError("Could not create window"); - return false; - } - - //------------------------------------------------------------------ - // setup OpenGL - - static PIXELFORMATDESCRIPTOR pfd = - { - sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor - 1, // Version Number - PFD_DRAW_TO_WINDOW | // Format Must Support Window - PFD_SUPPORT_OPENGL | // Format Must Support OpenGL - PFD_DOUBLEBUFFER, // Must Support Double Buffering - PFD_TYPE_RGBA, // Request An RGBA Format - kBitsPerPixel, // Select Our Color Depth - 0, 0, 0, 0, 0, 0, // Color Bits Ignored - 0, // No Alpha Buffer - 0, // Shift Bit Ignored - 0, // No Accumulation Buffer - 0, 0, 0, 0, // Accumulation Bits Ignored - 16, // 16Bit Z-Buffer (Depth Buffer) - 0, // No Stencil Buffer - 0, // No Auxiliary Buffer - PFD_MAIN_PLANE, // Main Drawing Layer - 0, // Reserved - 0, 0, 0 // Layer Masks Ignored - }; - - if (!(hDC = GetDC( g_windowHandle))) - ReportError( "Could not get device context"); - - GLuint PixelFormat; - if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) - { - ReportError( "Could not find appropriate pixel format"); - return false; - } - - if (!DescribePixelFormat(hDC, PixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) - { - ReportError( "Could not retrieve pixel format"); - return false; - } - - if (!SetPixelFormat( hDC, PixelFormat, &pfd)) - { - ReportError( "Could not set pixel format"); - return false; - } - - if (!(hRC = wglCreateContext(hDC))) - { - ReportError( "Could not create rendering context"); - return false; - } - - if (!wglMakeCurrent(hDC, hRC)) - { - ReportError( "Could not activate rendering context"); - return false; - } - - if (fullscreen) - { - // Place the window above all topmost windows - SetWindowPos( g_windowHandle, HWND_TOPMOST, 0,0,0,0, - SWP_NOMOVE | SWP_NOSIZE ); - } - - SetForegroundWindow(g_windowHandle); - SetFocus(g_windowHandle); #endif glClear( GL_COLOR_BUFFER_BIT ); @@ -1205,50 +1070,6 @@ static void DoMouse(Game & game) else if (game.mousecoordv >= kContextHeight) game.mousecoordv = kContextHeight - 1; } -#else - static Point lastMouse = {-1,-1}; - Point globalMouse; - - POINT pos; - GetCursorPos(&pos); - ScreenToClient(g_windowHandle, &pos); - globalMouse.h = pos.x; - globalMouse.v = pos.y; - - if (lastMouse.h == globalMouse.h && lastMouse.v == globalMouse.v) - { - game.deltah=0; - game.deltav=0; - } - else - { - static Point virtualMouse = {0,0}; - delta = globalMouse; - - delta.h -= lastMouse.h; - delta.v -= lastMouse.v; - lastMouse.h = pos.x; - lastMouse.v = pos.y; - - if(mainmenu||(abs(delta.h)<10*realmultiplier*1000&&abs(delta.v)<10*realmultiplier*1000)){ - game.deltah=delta.h*usermousesensitivity; - game.deltav=delta.v*usermousesensitivity; - game.mousecoordh=globalMouse.h; - game.mousecoordv=globalMouse.v; - } - - if(!mainmenu) - { - if(lastMouse.h>gMidPoint.h+100||lastMouse.hgMidPoint.v+100||lastMouse.vGetInfo())->m_mouseX = (signed short)(lParam & 0xffff); - ((WindowInfo *)g_lastWindow->GetInfo())->m_mouseY = (signed short)(lParam >> 16); - if (g_lastWindow->m_mouseCallbacksEnabled) g_lastWindow->MouseMoveCallback(); - */// goto winmessage; - return (0); - - case WM_SYSCOMMAND: // Intercept System Commands - { - switch (wParam) // Check System Calls - { - case SC_SCREENSAVE: // Screensaver Trying To Start? - case SC_MONITORPOWER: // Monitor Trying To Enter Powersave? - return 0; // Prevent From Happening - - // User trying to access application menu using ALT? - case SC_KEYMENU: - return 0; - } - } - break; - - case WM_MOVE: -// { -// ReleaseCapture(); -// ClipMouseToWindow(hWnd); -// } - break; - - case WM_SIZE: - break; - - case WM_CLOSE: - { - //gDone = true; - //game.tryquit=1; - } - //return (0); - - case WM_DESTROY: - { - //ClipCursor(NULL); - PostQuitMessage(0); /* Terminate Application */ - } - return (0); - - case WM_ERASEBKGND: - break; - - case WM_PAINT: -// BeginPaint( g_windowHandle,&ps); -// EndPaint( g_windowHandle,&ps); - break; - - default: - break; - } - - /* We processed the message and there - * is no processing by Windows necessary */ - - /* We didn't process the message so let Windows do it */ - return DefWindowProc(hWnd,msg,wParam,lParam); - } - - - static BOOL RegisterWindowClasses(HINSTANCE hFirstInstance) - { - WNDCLASSEX wc; - memset( &wc, 0, sizeof( wc)); - - /* Register the window class. */ - wc.cbSize = sizeof(wc); -#undef style - wc.style = (CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_OWNDC); /* Combination of Class Styles */ - wc.lpfnWndProc = AppWndProc; /* Adress of Window Procedure */ - wc.cbClsExtra = 0; /* Extra Bytes allocated for this Class */ - wc.cbWndExtra = 0; /* Extra Bytes allocated for each Window */ - wc.hInstance = hFirstInstance; /* Handle of program instance */ - wc.hIcon = LoadIcon( hFirstInstance, MAKEINTRESOURCE(IDI_LUGARU) ); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.lpszClassName = g_wndClassName; /* Name of the Window Class */ - wc.hIconSm = LoadIcon( hFirstInstance, MAKEINTRESOURCE(IDI_LUGARU) ); - - if (!RegisterClassEx(&wc)) return FALSE; /* Register Class failed */ - - return TRUE; - } -#endif - #if !USE_SDL int resolutionID(int width, int height) { @@ -2359,69 +1590,6 @@ int main(int argc, char **argv) return res; } - #ifdef WIN32 - int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) - { - int argc = 0; - LPWSTR * cl = CommandLineToArgvW(GetCommandLineW(), &argc); - if (argc > 1) - { - if (0 == _wcsicmp(cl[1], L"-windowed")) - { - fullscreen = false; - } - } - - memset( &g_theKeys, 0, sizeof( KeyMap)); - - unsigned int i = 0; - DEVMODE mode; - memset(&mode, 0, sizeof(mode)); - mode.dmSize = sizeof(mode); - while (EnumDisplaySettings(NULL, i++, &mode)) - { - if (mode.dmBitsPerPel < 16) - { - continue; - } - - int res = resolutionID(mode.dmPelsWidth, mode.dmPelsHeight); - - if (res > -1 && res < 8) - { - if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettings(&mode, CDS_TEST)) - { - continue; - } - - switch(mode.dmBitsPerPel) - { - case 32: - case 24: - resolutionDepths[res][1] = mode.dmBitsPerPel; - break; - case 16: - resolutionDepths[res][0] = mode.dmBitsPerPel; - break; - } - } - } - - /* if there is no Instance of our program in memory then register the window class */ - if (hPrevInstance == NULL && !RegisterWindowClasses(hInstance)) - return FALSE; /* registration failed! */ - - g_appInstance=hInstance; - - main(0, NULL); - - UnregisterClass( g_wndClassName, hInstance); - - return TRUE; - - } - #endif - extern int channels[100]; extern OPENAL_SAMPLE * samp[100]; extern OPENAL_STREAM * strm[20]; diff --git a/Source/TGALoader.h b/Source/TGALoader.h index 82501be..b27cb18 100644 --- a/Source/TGALoader.h +++ b/Source/TGALoader.h @@ -36,7 +36,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define Polygon WinPolygon #include #undef Polygon -#include +#include "GL/gl.h" #else #include "gamegl.h" // #include "MoreFilesX.h" diff --git a/Source/Text.cpp b/Source/Text.cpp index 1298b38..e1c2878 100644 --- a/Source/Text.cpp +++ b/Source/Text.cpp @@ -85,30 +85,18 @@ void Text::BuildFont() // Build Our Font Display List // base=glGenLists(256); // Creating 256 Display Lists base=glGenLists(512); // Creating 256 Display Lists glBindTexture(GL_TEXTURE_2D, FontTexture); // Select Our Font Texture - for (loop=0; loop<256; loop++) // Loop Through All 256 Lists + for (loop=0; loop<512; loop++) // Loop Through All 256 Lists { - cx=float(loop%16)/16.0f; // X Position Of Current Character - cy=float(loop/16)/16.0f; // Y Position Of Current Character - - glNewList(base+loop,GL_COMPILE); // Start Building A List - glBegin(GL_QUADS); // Use A Quad For Each Character - glTexCoord2f(cx,1-cy-0.0625f+.001); // Texture Coord (Bottom Left) - glVertex2i(0,0); // Vertex Coord (Bottom Left) - glTexCoord2f(cx+0.0625f,1-cy-0.0625f+.001); // Texture Coord (Bottom Right) - glVertex2i(16,0); // Vertex Coord (Bottom Right) - glTexCoord2f(cx+0.0625f,1-cy-.001); // Texture Coord (Top Right) - glVertex2i(16,16); // Vertex Coord (Top Right) - glTexCoord2f(cx,1-cy-+.001); // Texture Coord (Top Left) - glVertex2i(0,16); // Vertex Coord (Top Left) - glEnd(); // Done Building Our Quad (Character) - glTranslated(10,0,0); // Move To The Right Of The Character - glEndList(); // Done Building The Display List - } // Loop Until All 256 Are Built - for (loop=256; loop<512; loop++) // Loop Through All 256 Lists - { - cx=float((loop-256)%16)/16.0f; // X Position Of Current Character - cy=float((loop-256)/16)/16.0f; // Y Position Of Current Character - + if (loop < 256) + { + cx=float(loop%16)/16.0f; // X Position Of Current Character + cy=float(loop/16)/16.0f; // Y Position Of Current Character + } + else + { + cx=float((loop-256)%16)/16.0f; // X Position Of Current Character + cy=float((loop-256)/16)/16.0f; // Y Position Of Current Character + } glNewList(base+loop,GL_COMPILE); // Start Building A List glBegin(GL_QUADS); // Use A Quad For Each Character glTexCoord2f(cx,1-cy-0.0625f+.001); // Texture Coord (Bottom Left) @@ -120,43 +108,20 @@ void Text::BuildFont() // Build Our Font Display List glTexCoord2f(cx,1-cy-+.001); // Texture Coord (Top Left) glVertex2i(0,16); // Vertex Coord (Top Left) glEnd(); // Done Building Our Quad (Character) - glTranslated(8,0,0); // Move To The Right Of The Character + if (loop < 256) + glTranslated(10,0,0); // Move To The Right Of The Character + else + glTranslated(8,0,0); // Move To The Right Of The Character glEndList(); // Done Building The Display List } // Loop Until All 256 Are Built } void Text::glPrint(float x, float y, char *string, int set, float size, float width, float height) // Where The Printing Happens { - if (set>1) - { - set=1; - } - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glBindTexture(GL_TEXTURE_2D, FontTexture); // Select Our Font Texture - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,width,0,height,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); - glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left) - glScalef(size,size,1); // Reset The Modelview Matrix - glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1) - glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + glPrint(x, y, string, set, size, width, height, 0, strlen(string)); } -void Text::glPrint(float x, float y, char *string, int set, float size, float width, float height,int start,int end) // Where The Printing Happens +void Text::_glPrint(float x, float y, char *string, int set, float size, float width, float height,int start,int end, int offset) // Where The Printing Happens { if (set>1) { @@ -177,7 +142,7 @@ void Text::glPrint(float x, float y, char *string, int set, float size, float wi glLoadIdentity(); glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left) glScalef(size,size,1); // Reset The Modelview Matrix - glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1) + glListBase(base-32+(128*set) + offset); // Choose The Font Set (0 or 1) glCallLists(end-start,GL_BYTE,&string[start]); // Write The Text To The Screen glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix @@ -187,75 +152,23 @@ void Text::glPrint(float x, float y, char *string, int set, float size, float wi glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); } +void Text::glPrint(float x, float y, char *string, int set, float size, float width, float height,int start,int end) // Where The Printing Happens +{ + _glPrint(x, y, string, set, size, width, height, start, end, 0); +} void Text::glPrintOutline(float x, float y, char *string, int set, float size, float width, float height) // Where The Printing Happens { - if (set>1) - { - set=1; - } - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glBindTexture(GL_TEXTURE_2D, FontTexture); // Select Our Font Texture - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,width,0,height,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); - glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left) - glScalef(size,size,1); // Reset The Modelview Matrix - glListBase(base-32+(128*set)+256); // Choose The Font Set (0 or 1) - glCallLists(strlen(string),GL_BYTE,string); // Write The Text To The Screen - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + glPrintOutline(x, y, string, set, size, width, height, 0, strlen(string)); } void Text::glPrintOutline(float x, float y, char *string, int set, float size, float width, float height,int start,int end) // Where The Printing Happens { - if (set>1) - { - set=1; - } - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glBindTexture(GL_TEXTURE_2D, FontTexture); // Select Our Font Texture - glDisable(GL_DEPTH_TEST); // Disables Depth Testing - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPushMatrix(); // Store The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - glOrtho(0,width,0,height,-100,100); // Set Up An Ortho Screen - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPushMatrix(); // Store The Modelview Matrix - glLoadIdentity(); - glTranslated(x,y,0); // Position The Text (0,0 - Bottom Left) - glScalef(size,size,1); // Reset The Modelview Matrix - glListBase(base-32+(128*set)+256); // Choose The Font Set (0 or 1) - glCallLists(end-start,GL_BYTE,&string[start]); // Write The Text To The Screen - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glPopMatrix(); // Restore The Old Projection Matrix - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + _glPrint(x, y, string, set, size, width, height, start, end, 256); } - void Text::glPrintOutlined(float x, float y, char *string, int set, float size, float width, float height) // Where The Printing Happens { - glColor4f(0,0,0,1); - glPrintOutline( x-2*size, y-2*size, string, set, size*2.5/2, width, height); - glColor4f(1,1,1,1); - glPrint( x, y, string, set, size, width, height); + glPrintOutlined(1, 1, 1, x, y, string, set, size, width, height); } void Text::glPrintOutlined(float r, float g, float b, float x, float y, char *string, int set, float size, float width, float height) // Where The Printing Happens diff --git a/Source/Text.h b/Source/Text.h index 8627479..d2502ab 100644 --- a/Source/Text.h +++ b/Source/Text.h @@ -46,6 +46,9 @@ public: Text(); ~Text(); + +private: + void _glPrint(float x, float y, char *string, int set, float size, float width, float height, int start, int end, int offset); }; #endif diff --git a/Source/WinInput.cpp b/Source/WinInput.cpp index c13bb91..59b1277 100644 --- a/Source/WinInput.cpp +++ b/Source/WinInput.cpp @@ -61,306 +61,6 @@ Boolean IsKeyDown( unsigned char *keyMap, unsigned short theKey ) return 0; } -#if defined(_WIN32) -unsigned short CharToKey(const char* which) -{ - // alphabetic keys - if(!stricmp(which,"a")){ - return MAC_A_KEY; - } - if(!stricmp(which,"b")){ - return MAC_B_KEY; - } - if(!stricmp(which,"c")){ - return MAC_C_KEY; - } - if(!stricmp(which,"d")){ - return MAC_D_KEY; - } - if(!stricmp(which,"e")){ - return MAC_E_KEY; - } - if(!stricmp(which,"f")){ - return MAC_F_KEY; - } - if(!stricmp(which,"g")){ - return MAC_G_KEY; - } - if(!stricmp(which,"h")){ - return MAC_H_KEY; - } - if(!stricmp(which,"i")){ - return MAC_I_KEY; - } - if(!stricmp(which,"j")){ - return MAC_J_KEY; - } - if(!stricmp(which,"k")){ - return MAC_K_KEY; - } - if(!stricmp(which,"l")){ - return MAC_L_KEY; - } - if(!stricmp(which,"m")){ - return MAC_M_KEY; - } - if(!stricmp(which,"n")){ - return MAC_N_KEY; - } - if(!stricmp(which,"o")){ - return MAC_O_KEY; - } - if(!stricmp(which,"p")){ - return MAC_P_KEY; - } - if(!stricmp(which,"q")){ - return MAC_Q_KEY; - } - if(!stricmp(which,"r")){ - return MAC_R_KEY; - } - if(!stricmp(which,"s")){ - return MAC_S_KEY; - } - if(!stricmp(which,"t")){ - return MAC_T_KEY; - } - if(!stricmp(which,"u")){ - return MAC_U_KEY; - } - if(!stricmp(which,"v")){ - return MAC_V_KEY; - } - if(!stricmp(which,"w")){ - return MAC_W_KEY; - } - if(!stricmp(which,"x")){ - return MAC_X_KEY; - } - if(!stricmp(which,"y")){ - return MAC_Y_KEY; - } - if(!stricmp(which,"z")){ - return MAC_Z_KEY; - } - - // keypad keys - if(!stricmp(which,"KP0")){ - return MAC_NUMPAD_0_KEY; - } - if(!stricmp(which,"KP1")){ - return MAC_NUMPAD_1_KEY; - } - if(!stricmp(which,"KP2")){ - return MAC_NUMPAD_2_KEY; - } - if(!stricmp(which,"KP3")){ - return MAC_NUMPAD_3_KEY; - } - if(!stricmp(which,"KP4")){ - return MAC_NUMPAD_4_KEY; - } - if(!stricmp(which,"KP5")){ - return MAC_NUMPAD_5_KEY; - } - if(!stricmp(which,"KP6")){ - return MAC_NUMPAD_6_KEY; - } - if(!stricmp(which,"KP7")){ - return MAC_NUMPAD_7_KEY; - } - if(!stricmp(which,"KP8")){ - return MAC_NUMPAD_8_KEY; - } - if(!stricmp(which,"KP9")){ - return MAC_NUMPAD_9_KEY; - } - - // enter - if(!stricmp(which,"enter")){ - return MAC_ENTER_KEY; - } - - // number keys - if(!stricmp(which,"0")){ - return MAC_0_KEY; - } - if(!stricmp(which,"1")){ - return MAC_1_KEY; - } - if(!stricmp(which,"2")){ - return MAC_2_KEY; - } - if(!stricmp(which,"3")){ - return MAC_3_KEY; - } - if(!stricmp(which,"4")){ - return MAC_4_KEY; - } - if(!stricmp(which,"5")){ - return MAC_5_KEY; - } - if(!stricmp(which,"6")){ - return MAC_6_KEY; - } - if(!stricmp(which,"7")){ - return MAC_7_KEY; - } - if(!stricmp(which,"8")){ - return MAC_8_KEY; - } - if(!stricmp(which,"9")){ - return MAC_9_KEY; - } - - // function keys - if(!stricmp(which,"F1")){ - return MAC_F1_KEY; - } - if(!stricmp(which,"F2")){ - return MAC_F2_KEY; - } - if(!stricmp(which,"F3")){ - return MAC_F3_KEY; - } - if(!stricmp(which,"F4")){ - return MAC_F4_KEY; - } - if(!stricmp(which,"F5")){ - return MAC_F5_KEY; - } - if(!stricmp(which,"F6")){ - return MAC_F6_KEY; - } - if(!stricmp(which,"F7")){ - return MAC_F7_KEY; - } - if(!stricmp(which,"F8")){ - return MAC_F8_KEY; - } - if(!stricmp(which,"F9")){ - return MAC_F9_KEY; - } - if(!stricmp(which,"F10")){ - return MAC_F10_KEY; - } - if(!stricmp(which,"F11")){ - return MAC_F11_KEY; - } - if(!stricmp(which,"F12")){ - return MAC_F12_KEY; - } - - // escape - if(!stricmp(which,"escape")){ - return MAC_ESCAPE_KEY; - } - if(!stricmp(which,"backspace")){ - return MAC_DELETE_KEY; - } - if(!stricmp(which,"tab")){ - return MAC_TAB_KEY; - } - if(!stricmp(which,"`")){ - return MAC_TILDE_KEY; - } - if(!stricmp(which,"caps_lock")){ - return MAC_CAPS_LOCK_KEY; - } -// if(which==){ -// return ""; -// } - if(!stricmp(which,"command")){ - return MAC_COMMAND_KEY; - } - if(!stricmp(which,"option")){ - return MAC_OPTION_KEY; - } - if(!stricmp(which,"delete")){ - return MAC_DEL_KEY; - } - if(!stricmp(which,"insert")){ - return MAC_INSERT_KEY; - } - if(!stricmp(which,"home")){ - return MAC_HOME_KEY; - } - if(!stricmp(which,"end")){ - return MAC_END_KEY; - } - if(!stricmp(which,"page_up")){ - return MAC_PAGE_UP_KEY; - } - if(!stricmp(which,"page_down")){ - return MAC_PAGE_DOWN_KEY; - } - if(!stricmp(which,"clear")){ - return MAC_NUMPAD_CLEAR_KEY; - } - - if(!stricmp(which,"control")){ - return MAC_CONTROL_KEY; - } - if(!stricmp(which,"return")){ - return MAC_RETURN_KEY; - } - if(!stricmp(which,"space")){ - return MAC_SPACE_KEY; - } - if(!stricmp(which,"shift")){ - return MAC_SHIFT_KEY; - } - if(!stricmp(which,"uparrow")){ - return MAC_ARROW_UP_KEY; - } - if(!stricmp(which,"downarrow")){ - return MAC_ARROW_DOWN_KEY; - } - if(!stricmp(which,"leftarrow")){ - return MAC_ARROW_LEFT_KEY; - } - if(!stricmp(which,"rightarrow")){ - return MAC_ARROW_RIGHT_KEY; - } - if(!stricmp(which,"mouse1")){ - return MAC_MOUSEBUTTON1; - } - if(!stricmp(which,"mouse2")){ - return MAC_MOUSEBUTTON2; - } - if(!stricmp(which,"+")){ - return MAC_NUMPAD_PLUS_KEY; - } - if(!stricmp(which,"*")){ - return MAC_NUMPAD_ASTERISK_KEY; - } - if(!stricmp(which,"/")){ - return MAC_SLASH_KEY; - } - if(!stricmp(which,"\\")){ - return MAC_BACKSLASH_KEY; - } - if(!stricmp(which,"[")){ - return MAC_LEFTBRACKET_KEY; - } - if(!stricmp(which,"]")){ - return MAC_RIGHTBRACKET_KEY; - } - if(!stricmp(which,".")){ - return MAC_PERIOD_KEY; - } - if(!stricmp(which,",")){ - return MAC_COMMA_KEY; - } - if(!stricmp(which,"\"")){ - return MAC_APOSTROPHE_KEY; - } - if(!stricmp(which,";")){ - return MAC_SEMICOLON_KEY; - } - return UNKNOWN_KEY; -} -#else unsigned short CharToKey(const char* which) { // alphabetic keys @@ -659,7 +359,6 @@ unsigned short CharToKey(const char* which) } return UNKNOWN_KEY; } -#endif const char* KeyToChar(unsigned short which) { diff --git a/Source/gamegl.h b/Source/gamegl.h index 20d94ce..e682361 100644 --- a/Source/gamegl.h +++ b/Source/gamegl.h @@ -30,32 +30,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include -#ifndef WIN32 - #if PLATFORM_UNIX - #define GL_GLEXT_PROTOTYPES - #include "GL/gl.h" - #include "GL/glu.h" - #include "GL/glext.h" - #else - #include - #include - #include - #endif -#else +#ifdef WIN32 #define WIN32_LEAN_AND_MEAN #define Polygon WinPolygon #include #undef Polygon - #define GL_GLEXT_PROTOTYPES - #include - #include - //#include -- EVIL and OLD, NEVER USE IT! - #include - #include "MacCompatibility.h" - //#include "il/ilut.h" - #endif +#define GL_GLEXT_PROTOTYPES 1 +#include "GL/gl.h" +#include "GL/glu.h" +#include "GL/glext.h" +#include "MacCompatibility.h" + #if !PLATFORM_MACOSX struct RGBColor { diff --git a/Source/openal_wrapper.h b/Source/openal_wrapper.h index 08ab1be..f31c6c0 100644 --- a/Source/openal_wrapper.h +++ b/Source/openal_wrapper.h @@ -1,6 +1,10 @@ #ifndef OPENAL_WRAPPER_H #define OPENAL_WRAPPER_H +#ifdef _WIN32 +#include +#endif + #include "AL/al.h" #include "AL/alc.h" diff --git a/Source/wincompat.h b/Source/wincompat.h deleted file mode 100644 index f521267..0000000 --- a/Source/wincompat.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -Copyright (C) 2003, 2010 - Wolfire Games - -This file is part of Lugaru. - -Lugaru is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#if !defined(WINCOMPAT_INCLUDED) && !defined(PLATFORM_WINDOWS) && !defined(WIN32) && !defined(WINDOWS) && !defined(__WIN32__) -#define WINCOMPAT_INCLUDED - -/** - * - * Author: Magnus Naeslund (mag@fbab.net, mag@bahnhof.se) - * (c) 2000 Magnus Naeslund, all rights reserved - * - */ - -#include -#include -#include -#include -#include -#include - -#ifndef TRUE - #define TRUE 1 -#endif -#ifndef FALSE - #define FALSE 0 -#endif - -#define _kbhit kbhit -#define stricmp strcasecmp -#define strnicmp strncasecmp - -#define Sleep(x) usleep((x)*1000) - -static int inited=0; -static struct termios ori; - -static void tcatexit(){ - tcsetattr(0,0,&ori); -} - -static void init_terminal(){ - struct termios t; - tcgetattr(0,&t); - tcgetattr(0,&ori); - t.c_lflag &= ~(ICANON); - tcsetattr(0,0,&t); - atexit(tcatexit); -} - -static inline int kbhit(){ - fd_set rfds; - struct timeval tv; - - if (!inited){ - inited=1; - init_terminal(); - } - - FD_ZERO(&rfds); - FD_SET(0, &rfds); - tv.tv_sec = 0; - tv.tv_usec = 10*1000; - return select(1, &rfds, NULL, NULL, &tv)>0; -} - -static inline int getch(){ - fd_set rfds; - - if (!inited){ - inited=1; - init_terminal(); - } - - FD_ZERO(&rfds); - FD_SET(0, &rfds); - if (select(1, &rfds, NULL, NULL, NULL)>0) - return getchar(); - else{ - printf("wincompat.h: select() on fd 0 failed\n"); - return 0xDeadBeef; - } -} - -#endif - diff --git a/makefile.old b/makefile.old index 5dd3b42..4527b45 100644 --- a/makefile.old +++ b/makefile.old @@ -100,6 +100,9 @@ ifeq ($(strip $(macosx)),true) LDFLAGS += -Wl,-syslibroot,$(XCODE_DIR)/SDKs/$(macosx_sdk_dir) LDFLAGS += -framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation -framework Carbon -framework OpenAL LDFLAGS += ./Dependencies/SDL12/lib/macosx/libSDL-1.2.0.dylib ./Dependencies/SDL12/lib/macosx/libSDLmain-osx.a + + INCLUDES += -IDependencies/OpenAL/include/AL + INCLUDES += -IDependencies/SDL12/include else CXX := g++ CC := gcc