diff --git a/mozilla/modules/plugin/samples/default/mac/DefaultPlugin.pbproj/project.pbxproj b/mozilla/modules/plugin/samples/default/mac/DefaultPlugin.pbproj/project.pbxproj new file mode 100644 index 00000000000..da877e41e2b --- /dev/null +++ b/mozilla/modules/plugin/samples/default/mac/DefaultPlugin.pbproj/project.pbxproj @@ -0,0 +1,387 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 38; + objects = { + 089C1669FE841209C02AAC07 = { + buildStyles = ( + 4F9091AC011F3BD104CA0E50, + 4F9091AD011F3BD104CA0E50, + F50EB520038ABFA401A9666E, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 089C166AFE841209C02AAC07; + projectDirPath = ""; + targets = ( + 089C1673FE841209C02AAC07, + F59D147102AC328B01000104, + ); + }; + 089C166AFE841209C02AAC07 = { + children = ( + 08FB77ADFE841716C02AAC07, + 089C167CFE841241C02AAC07, + 089C1671FE841209C02AAC07, + 19C28FB4FE9D528D11CA2CBB, + ); + isa = PBXGroup; + name = MRJPlugin; + refType = 4; + }; + 089C1671FE841209C02AAC07 = { + children = ( + F5A7D3AB036E359F01A96660, + 08EA7FFBFE8413EDC02AAC07, + F51A400C0299CD65012FC976, + ); + isa = PBXGroup; + name = "External Frameworks and Libraries"; + refType = 4; + }; + 089C1673FE841209C02AAC07 = { + buildPhases = ( + 089C1674FE841209C02AAC07, + 089C1675FE841209C02AAC07, + 089C1676FE841209C02AAC07, + 089C1677FE841209C02AAC07, + 089C1679FE841209C02AAC07, + F5BFB5E8029AD01B01000102, + ); + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "\"$(SYSTEM_LIBRARY_DIR)/Frameworks/CoreFoundation.framework\""; + HEADER_SEARCH_PATHS = "../../../../../dist/sdk/xpcom/include ../../../../../dist/include/caps ../../../../../dist/include/java ../../../../../dist/include/js ../../../../../dist/include/nspr ../../../../../dist/include/nspr/obsolete ../../../../../dist/include/oji ../../../../../dist/include/plugin ../../../../../dist/include/xpcom ../../../../../dist/include/xpconnect ../../../../../dist/include /Developer/Headers/FlatCarbon"; + LIBRARY_SEARCH_PATHS = /usr/lib; + OTHER_CFLAGS = "-DXP_MACOSX=1 -DNO_X11=1 -DUSE_SYSTEM_CONSOLE=1"; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PREFIX_HEADER = DefaultPluginPrefix.h; + PRODUCT_NAME = "Default Plugin"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + WRAPPER_EXTENSION = plugin; + }; + dependencies = ( + F59D147202AC350E01000104, + ); + isa = PBXBundleTarget; + name = "Default Plugin"; + productName = MRJPlugin; + productReference = 4F9091AB011F3BD104CA0E50; + productSettingsXML = " + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Default Plugin + CFBundleIconFile + + CFBundleIdentifier + com.netscape.DefaultPlugin + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + NSPL + CFBundleSignature + MOSS + CFBundleVersion + 1.0 + CSResourcesFileMapped + + + +"; + }; + 089C1674FE841209C02AAC07 = { + buildActionMask = 2147483647; + files = ( + 0F64AF2D0433C8A200A96652, + ); + isa = PBXHeadersBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 089C1675FE841209C02AAC07 = { + buildActionMask = 2147483647; + files = ( + 089C1680FE841241C02AAC07, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 089C1676FE841209C02AAC07 = { + buildActionMask = 2147483647; + files = ( + F5E0C350036A130901A96660, + F5E0C352036A130E01A96660, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 089C1677FE841209C02AAC07 = { + buildActionMask = 2147483647; + files = ( + 08EA7FFCFE8413EDC02AAC07, + F51A400D0299CD65012FC976, + F5A7D695036E35A001A96660, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 089C1679FE841209C02AAC07 = { + buildActionMask = 2147483647; + files = ( + F5E0C34E036A12DF01A96660, + ); + isa = PBXRezBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 089C167CFE841241C02AAC07 = { + children = ( + 089C167DFE841241C02AAC07, + F5E0C34D036A12DF01A96660, + ); + isa = PBXGroup; + name = Resources; + refType = 4; + }; + 089C167DFE841241C02AAC07 = { + children = ( + 089C167EFE841241C02AAC07, + ); + isa = PBXVariantGroup; + name = InfoPlist.strings; + path = ""; + refType = 2; + }; + 089C167EFE841241C02AAC07 = { + fileEncoding = 10; + isa = PBXFileReference; + name = English; + path = English.lproj/InfoPlist.strings; + refType = 4; + }; + 089C1680FE841241C02AAC07 = { + fileRef = 089C167DFE841241C02AAC07; + isa = PBXBuildFile; + settings = { + }; + }; + 08EA7FFBFE8413EDC02AAC07 = { + isa = PBXFrameworkReference; + name = Carbon.framework; + path = /System/Library/Frameworks/Carbon.framework; + refType = 0; + }; + 08EA7FFCFE8413EDC02AAC07 = { + fileRef = 08EA7FFBFE8413EDC02AAC07; + isa = PBXBuildFile; + settings = { + }; + }; + 08FB77ADFE841716C02AAC07 = { + children = ( + 0F64AF2C0433C8A200A96652, + F5E0C34F036A130901A96660, + F5E0C351036A130E01A96660, + ); + isa = PBXGroup; + name = Source; + refType = 4; + }; +//080 +//081 +//082 +//083 +//084 +//0F0 +//0F1 +//0F2 +//0F3 +//0F4 + 0F64AF2C0433C8A200A96652 = { + fileEncoding = 4; + isa = PBXFileReference; + path = DefaultPluginPrefix.h; + refType = 4; + }; + 0F64AF2D0433C8A200A96652 = { + fileRef = 0F64AF2C0433C8A200A96652; + isa = PBXBuildFile; + settings = { + }; + }; +//0F0 +//0F1 +//0F2 +//0F3 +//0F4 +//190 +//191 +//192 +//193 +//194 + 19C28FB4FE9D528D11CA2CBB = { + children = ( + 4F9091AB011F3BD104CA0E50, + ); + isa = PBXGroup; + name = Products; + refType = 4; + }; +//190 +//191 +//192 +//193 +//194 +//4F0 +//4F1 +//4F2 +//4F3 +//4F4 + 4F9091AB011F3BD104CA0E50 = { + isa = PBXBundleReference; + path = "Default Plugin.plugin"; + refType = 3; + }; + 4F9091AC011F3BD104CA0E50 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = NO; + OPTIMIZATION_CFLAGS = "-O0"; + }; + isa = PBXBuildStyle; + name = Development; + }; + 4F9091AD011F3BD104CA0E50 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = YES; + }; + isa = PBXBuildStyle; + name = Deployment; + }; +//4F0 +//4F1 +//4F2 +//4F3 +//4F4 +//F50 +//F51 +//F52 +//F53 +//F54 + F50EB520038ABFA401A9666E = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = NO; + DEBUGGING_SYMBOLS = YES; + }; + isa = PBXBuildStyle; + name = DeploymentSymbols; + }; + F51A400C0299CD65012FC976 = { + isa = PBXFileReference; + name = "libstdc++.a"; + path = "/usr/lib/libstdc++.a"; + refType = 0; + }; + F51A400D0299CD65012FC976 = { + fileRef = F51A400C0299CD65012FC976; + isa = PBXBuildFile; + settings = { + }; + }; + F59D147102AC328B01000104 = { + buildArgumentsString = "$ACTION resources"; + buildPhases = ( + ); + buildSettings = { + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = Resources; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; + }; + buildToolPath = /usr/bin/gnumake; + buildWorkingDirectory = .; + dependencies = ( + ); + isa = PBXLegacyTarget; + name = Resources; + passBuildSettingsInEnvironment = 1; + productName = Resources; + settingsToExpand = 6; + settingsToPassInEnvironment = 287; + settingsToPassOnCommandLine = 280; + }; + F59D147202AC350E01000104 = { + isa = PBXTargetDependency; + target = F59D147102AC328B01000104; + }; + F5A7D3AB036E359F01A96660 = { + isa = PBXFrameworkReference; + name = CoreFoundation.framework; + path = /System/Library/Frameworks/CoreFoundation.framework; + refType = 0; + }; + F5A7D695036E35A001A96660 = { + fileRef = F5A7D3AB036E359F01A96660; + isa = PBXBuildFile; + settings = { + }; + }; + F5BFB5E8029AD01B01000102 = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + F5E0C34D036A12DF01A96660 = { + isa = PBXFileReference; + path = _NullPlugin.rsrc; + refType = 2; + }; + F5E0C34E036A12DF01A96660 = { + fileRef = F5E0C34D036A12DF01A96660; + isa = PBXBuildFile; + settings = { + }; + }; + F5E0C34F036A130901A96660 = { + fileEncoding = 30; + isa = PBXFileReference; + path = NullPlugin.cpp; + refType = 2; + }; + F5E0C350036A130901A96660 = { + fileRef = F5E0C34F036A130901A96660; + isa = PBXBuildFile; + settings = { + }; + }; + F5E0C351036A130E01A96660 = { + fileEncoding = 30; + isa = PBXFileReference; + path = npmac.cpp; + refType = 2; + }; + F5E0C352036A130E01A96660 = { + fileRef = F5E0C351036A130E01A96660; + isa = PBXBuildFile; + settings = { + }; + }; + }; + rootObject = 089C1669FE841209C02AAC07; +} diff --git a/mozilla/modules/plugin/samples/default/mac/DefaultPluginPrefix.h b/mozilla/modules/plugin/samples/default/mac/DefaultPluginPrefix.h new file mode 100644 index 00000000000..6d63b1daa12 --- /dev/null +++ b/mozilla/modules/plugin/samples/default/mac/DefaultPluginPrefix.h @@ -0,0 +1 @@ +#include "mozilla-config.h" diff --git a/mozilla/modules/plugin/samples/default/mac/English.lproj/InfoPlist.strings b/mozilla/modules/plugin/samples/default/mac/English.lproj/InfoPlist.strings new file mode 100644 index 00000000000..af285b9b483 Binary files /dev/null and b/mozilla/modules/plugin/samples/default/mac/English.lproj/InfoPlist.strings differ diff --git a/mozilla/modules/plugin/samples/default/mac/Makefile.in b/mozilla/modules/plugin/samples/default/mac/Makefile.in new file mode 100644 index 00000000000..b7a4fd41589 --- /dev/null +++ b/mozilla/modules/plugin/samples/default/mac/Makefile.in @@ -0,0 +1,91 @@ +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Brian Ryner +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +DEPTH = ../../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +ifdef MOZ_DEBUG +BUILDSTYLE = Development +else +ifdef CHIMERA_OPT_SYMBOLS +BUILDSTYLE = DeploymentSymbols +else +BUILDSTYLE = Deployment +endif +endif + +TARGET = "Default Plugin" + +include $(topsrcdir)/config/rules.mk + +# decodes resource files from AppleSingle to Resource Manager format. +ASDECODE = $(DIST)/bin/asdecode +RESOURCE_FILES = _NullPlugin.rsrc + +# for objdir builds, copy the project, and symlink the sources +ABS_topsrcdir := $(shell cd $(topsrcdir); pwd) +ifneq ($(ABS_topsrcdir),$(MOZ_BUILD_ROOT)) +export:: + rsync -a --exclude .DS_Store --exclude "CVS/" $(srcdir)/DefaultPlugin.pbproj . + ln -fs $(srcdir)/English.lproj + ln -fs $(srcdir)/DefaultPluginPrefix.h + ln -fs $(srcdir)/NullPlugin.cpp + ln -fs $(srcdir)/npmac.cpp +endif + +all:: build-plugin + +libs install:: install-plugin + +install-plugin: build-plugin + $(INSTALL) "build/Default Plugin.plugin" $(DIST)/bin/plugins + +resources: $(RESOURCE_FILES) + +build-plugin: resources + pbxbuild -target $(TARGET) -buildstyle $(BUILDSTYLE) + +_%.rsrc: %.rsrc + $(ASDECODE) $< $@ + +clean clobber:: + rm -f $(RESOURCE_FILES) + rm -rf build diff --git a/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp b/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp index c0689808bdd..d5ef21a5843 100644 --- a/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp +++ b/mozilla/modules/plugin/samples/default/mac/NullPlugin.cpp @@ -40,11 +40,18 @@ #include "npapi.h" #endif +#ifdef XP_MACOSX +#undef DARWIN +#include +#else +#include #include #include #include #include #include +#include +#endif #include #include @@ -66,6 +73,9 @@ public: static NPError Initialize(); static void Shutdown(); + // no ctor because CPlugin is allocated and constructed by hand. + // ideally, this should use placement |new|. + void Constructor(NPP instance, NPMIMEType type, uint16 mode, int16 argc, char* argn[], char* argv[]); void Destructor(); @@ -101,8 +111,9 @@ private: static char* sDefaultPage; static char* sRefreshText; static char* sJavaScriptPage; - static FSSpec sDataFileSpec; - + static FSSpec sDataFileSpec; // only used for Mac OS 9 + static Boolean sRunningOnOSX; + NPP fInstance; NPWindow* fWindow; uint16 fMode; @@ -131,6 +142,7 @@ char* CPlugin::sDefaultPage = NULL; char* CPlugin::sRefreshText = NULL; char* CPlugin::sJavaScriptPage = NULL; FSSpec CPlugin::sDataFileSpec; +Boolean CPlugin::sRunningOnOSX = false; extern short gResFile; @@ -154,9 +166,10 @@ const short rJavaScriptPageURL = 132; // 'STR#' const short rTypeListStrings = 129; -static char szPluginFinderCommandBeginning[] = PLUGINFINDER_COMMAND_BEGINNING; -static char szPluginFinderCommandEnd[] = PLUGINFINDER_COMMAND_END; +static const char szPluginFinderCommandBeginning[] = PLUGINFINDER_COMMAND_BEGINNING; +static const char szPluginFinderCommandEnd[] = PLUGINFINDER_COMMAND_END; +//#ifndef XP_MACOSX //------------------------------------------------------------------------------------ // strcasecomp: Why don't the MW C libraries have this?? @@ -170,11 +183,11 @@ int strcasecmp (const char* one, const char *two) const char *pB; for(pA=one, pB=two; *pA && *pB; pA++, pB++) - { - int tmp = XP_TO_LOWER(*pA) - XP_TO_LOWER(*pB); - if (tmp) + { + int tmp = XP_TO_LOWER(*pA) - XP_TO_LOWER(*pB); + if (tmp) return tmp; - } + } if (*pA) return 1; if (*pB) @@ -182,6 +195,8 @@ int strcasecmp (const char* one, const char *two) return 0; } +//#endif // XP_MACOSX + //------------------------------------------------------------------------------------ // NPP_Initialize: @@ -337,8 +352,8 @@ NPP_StreamAsFile(NPP /*instance*/, NPStream */*stream*/, const char* /*fname*/) void NP_LOADDS NPP_Print(NPP instance, NPPrint* printInfo) { - if (printInfo == NULL) - return; + if (printInfo == NULL) + return; if (instance != NULL) { @@ -388,6 +403,7 @@ jref NPP_GetJavaClass(void) return NULL; } +#pragma mark - //------------------------------------------------------------------------------------ // CPlugin::Initialize: @@ -395,11 +411,14 @@ jref NPP_GetJavaClass(void) NPError CPlugin::Initialize() { Handle string; - SInt16 wResFile; short saveResFile = CurResFile(); UseResFile(gResFile); + long systemVersion; + OSErr err = ::Gestalt(gestaltSystemVersion, &systemVersion); + sRunningOnOSX = (err == noErr) && (systemVersion >= 0x00001000); + // Get Resources CPlugin::sIconHandle = GetCIcon(rBrokenPluginIcon); CPlugin::sHandCursor = GetCursor(rHandCursor); @@ -490,11 +509,13 @@ NPError CPlugin::Initialize() ReleaseResource(string); UseResFile(saveResFile); - + + if (!sRunningOnOSX) // We'll make some CFPreferences the first time we have to on OS X { ProcessSerialNumber psn; ProcessInfoRec info; FSSpec fsTheApp; + SInt16 wResFile; OSErr wErr; psn.highLongOfPSN = 0; @@ -505,8 +526,7 @@ NPError CPlugin::Initialize() info.processAppSpec = &fsTheApp; wErr = ::GetProcessInformation(&psn, &info); if (wErr == noErr) { - wErr = FSMakeFSSpec(fsTheApp.vRefNum, fsTheApp.parID, "\p:Plug-ins:Default Plug-in Data", - &sDataFileSpec); + wErr = FSMakeFSSpec(fsTheApp.vRefNum, fsTheApp.parID, "\p:Plug-ins:Default Plug-in Data", &sDataFileSpec); if (wErr == fnfErr) { FSpCreateResFile(&sDataFileSpec, 'MOSS', 'BINA', smSystemScript); wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); @@ -521,6 +541,7 @@ NPError CPlugin::Initialize() } } } + return NPERR_NO_ERROR; } @@ -721,8 +742,8 @@ void CPlugin::Draw(HiliteState hilite) #if !TARGET_API_MAC_CARBON FillRect(&drawRect, &(gQDPtr->white)); #else - Pattern qdWhite; - FillRect(&drawRect, GetQDGlobalsWhite(&qdWhite)); + Pattern qdWhite; + FillRect(&drawRect, GetQDGlobalsWhite(&qdWhite)); #endif if (hilite == kHilited) { @@ -769,7 +790,8 @@ void CPlugin::MouseDown() { Draw(kHilited); Boolean inside = true; - + + // evil CPU-hogging loop on Mac OS X! while (StillDown()) { Point localMouse; @@ -811,11 +833,11 @@ Boolean CPlugin::FocusDraw() { GetPort(&fSavePort); SetPort((GrafPtr) ourPort); - Rect portRect; + Rect portRect; #if !TARGET_API_MAC_CARBON - portRect = ourPort->portRect; + portRect = ourPort->portRect; #else - GetPortBounds(ourPort, &portRect); + GetPortBounds(ourPort, &portRect); #endif fSavePortTop = portRect.top; fSavePortLeft = portRect.left; @@ -957,51 +979,106 @@ char *CPlugin::MakeDefaultURL(void) //------------------------------------------------------------------------------------ void CPlugin::AddMimeTypeToList(StringPtr cTypeString) { - Handle hTypeList; - SInt32 dwCount; - SInt32 index; - Str255 oldType; - SInt16 wResFile; - Boolean failedToFind = true; + if (sRunningOnOSX) + { + CFStringRef pluginKey = CFSTR("DefaultPluginSeenTypes"); // don't release this + CFStringRef mimeType = ::CFStringCreateWithPascalString(kCFAllocatorDefault, cTypeString, kCFStringEncodingASCII); + CFArrayRef prefsList = (CFArrayRef)::CFPreferencesCopyAppValue(pluginKey, kCFPreferencesCurrentApplication); + Boolean foundType = false; - wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); - if (wResFile != -1) { - hTypeList = Get1Resource('STR#', rTypeListStrings); - if (hTypeList != NULL) { - dwCount = **((short **)hTypeList); + if (prefsList == NULL) + { + CFStringRef stringArray[1]; + stringArray[0] = mimeType; - // First make sure it's not already in the list. - for (index = 1; index <= dwCount; index++) { - GetIndString(oldType, rTypeListStrings, index); - - // if the mimetype already exists in our list, or the plugin is NOT hidden, - // don't bring up the dialog box - if (EqualString(cTypeString, oldType, true, true) && !fHiddenPlugin) { - failedToFind = false; - break; // Found a match, so bail out! - } + prefsList = ::CFArrayCreate(kCFAllocatorDefault, (const void **)stringArray, 1, &kCFTypeArrayCallBacks); + if (prefsList) + { + ::CFPreferencesSetAppValue(pluginKey, prefsList, kCFPreferencesCurrentApplication); + ::CFRelease(prefsList); } - if (failedToFind) { - // Grow the string list handle - Size itsSize = GetHandleSize(hTypeList); - Size typeSize = cTypeString[0] + 1; - SetHandleSize(hTypeList, itsSize + typeSize); - - // Increment the count of strings in the list - (**((short**)hTypeList)) = (short)(++dwCount); - - // Copy the data from our string into the handle - long dwCount = Munger(hTypeList, itsSize, NULL, typeSize, cTypeString, typeSize); - - // Mark the resource as changed so it will be written out - if (dwCount > 0) { - ChangedResource(hTypeList); - UpdateResFile(wResFile); - } - } - ReleaseResource(hTypeList); } - FSClose(wResFile); + else + { + if (::CFGetTypeID(prefsList) == ::CFArrayGetTypeID()) + { + // first make sure it's not in the list + CFIndex count = ::CFArrayGetCount(prefsList); + for (CFIndex i = 0; i < count; i ++) + { + CFStringRef item = (CFStringRef)::CFArrayGetValueAtIndex(prefsList, i); // does not retain + if (item && + (::CFGetTypeID(item) == ::CFStringGetTypeID()) && + (::CFStringCompareWithOptions(item, mimeType, + CFRangeMake(0, ::CFStringGetLength(item)), kCFCompareCaseInsensitive) == kCFCompareEqualTo)) + { + foundType = true; + break; + } + } + + if (!foundType && !fHiddenPlugin) + { + CFMutableArrayRef typesArray = ::CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, (CFArrayRef)prefsList); + if (typesArray) + { + ::CFArrayAppendValue(typesArray, mimeType); + ::CFPreferencesSetAppValue(pluginKey, typesArray, kCFPreferencesCurrentApplication); + } + } + } + ::CFRelease(prefsList); + } + ::CFRelease(mimeType); + } + else + { + Handle hTypeList; + SInt32 dwCount; + SInt32 index; + Str255 oldType; + SInt16 wResFile; + Boolean failedToFind = true; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdWrPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + dwCount = **((short **)hTypeList); + + // First make sure it's not already in the list. + for (index = 1; index <= dwCount; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(cTypeString, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + if (failedToFind) { + // Grow the string list handle + Size itsSize = GetHandleSize(hTypeList); + Size typeSize = cTypeString[0] + 1; + SetHandleSize(hTypeList, itsSize + typeSize); + + // Increment the count of strings in the list + (**((short**)hTypeList)) = (short)(++dwCount); + + // Copy the data from our string into the handle + long dwCount = Munger(hTypeList, itsSize, NULL, typeSize, cTypeString, typeSize); + + // Mark the resource as changed so it will be written out + if (dwCount > 0) { + ChangedResource(hTypeList); + UpdateResFile(wResFile); + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); + } } } @@ -1023,41 +1100,72 @@ void CPlugin::AddMimeTypeToList(StringPtr cTypeString) //------------------------------------------------------------------------------------ Boolean CPlugin::CheckMimeTypes() { - Handle hTypeList; - SInt32 index; - Str255 oldType; - Str255 ourType; - SInt16 wResFile; - Boolean failedToFind = true; + Boolean failedToFind = true; - wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdPerm); - if (wResFile != -1) { - hTypeList = Get1Resource('STR#', rTypeListStrings); - if (hTypeList != NULL) { - // Convert the mime-type C string to a Pascal string. - index = strlen(fType); - if (index > 255) { // don't blow out the Str255 - index = 255; - } - BlockMoveData(fType, &ourType[1], index); - ourType[0] = index; - - short count = **((short **)hTypeList); - - // Iterate through all the strings in the list. - for (index = 1; index <= count; index++) { - GetIndString(oldType, rTypeListStrings, index); - - // if the mimetype already exists in our list, or the plugin is NOT hidden, - // don't bring up the dialog box - if (EqualString(ourType, oldType, true, true) && !fHiddenPlugin) { - failedToFind = false; - break; // Found a match, so bail out! + if (sRunningOnOSX) + { + CFStringRef pluginKey = CFSTR("DefaultPluginSeenTypes"); // don't release this + CFStringRef mimeType = ::CFStringCreateWithCString(kCFAllocatorDefault, fType, kCFStringEncodingASCII); + CFArrayRef prefsList = (CFArrayRef)::CFPreferencesCopyAppValue(pluginKey, kCFPreferencesCurrentApplication); + if (prefsList) + { + if (::CFGetTypeID(prefsList) == ::CFArrayGetTypeID()) + { + CFIndex count = ::CFArrayGetCount(prefsList); + for (CFIndex i = 0; i < count; i ++) + { + CFStringRef item = (CFStringRef)::CFArrayGetValueAtIndex(prefsList, i); // does not retain + if (item && + (::CFGetTypeID(item) == ::CFStringGetTypeID()) && + (::CFStringCompareWithOptions(item, mimeType, + CFRangeMake(0, ::CFStringGetLength(item)), kCFCompareCaseInsensitive) == kCFCompareEqualTo)) + { + failedToFind = false; + break; + } } } - ReleaseResource(hTypeList); + ::CFRelease(prefsList); + } + ::CFRelease(mimeType); + } + else + { + Handle hTypeList; + SInt32 index; + Str255 oldType; + Str255 ourType; + SInt16 wResFile; + + wResFile = FSpOpenResFile(&CPlugin::sDataFileSpec, fsRdPerm); + if (wResFile != -1) { + hTypeList = Get1Resource('STR#', rTypeListStrings); + if (hTypeList != NULL) { + // Convert the mime-type C string to a Pascal string. + index = strlen(fType); + if (index > 255) { // don't blow out the Str255 + index = 255; + } + BlockMoveData(fType, &ourType[1], index); + ourType[0] = index; + + short count = **((short **)hTypeList); + + // Iterate through all the strings in the list. + for (index = 1; index <= count; index++) { + GetIndString(oldType, rTypeListStrings, index); + + // if the mimetype already exists in our list, or the plugin is NOT hidden, + // don't bring up the dialog box + if (EqualString(ourType, oldType, true, true) && !fHiddenPlugin) { + failedToFind = false; + break; // Found a match, so bail out! + } + } + ReleaseResource(hTypeList); + } + FSClose(wResFile); } - FSClose(wResFile); } return(failedToFind); } @@ -1087,7 +1195,7 @@ void CPlugin::AskAndLoadURL() #if !TARGET_API_MAC_CARBON SetCursor(&(gQDPtr->arrow)); #else - Cursor qdArrow; + Cursor qdArrow; SetCursor(GetQDGlobalsArrow(&qdArrow)); #endif diff --git a/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc b/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc index cec3f563f77..1a09fad814f 100644 Binary files a/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc and b/mozilla/modules/plugin/samples/default/mac/NullPlugin.rsrc differ diff --git a/mozilla/modules/plugin/samples/default/mac/npmac.cpp b/mozilla/modules/plugin/samples/default/mac/npmac.cpp index 63ca73d0937..da00bfe9d26 100644 --- a/mozilla/modules/plugin/samples/default/mac/npmac.cpp +++ b/mozilla/modules/plugin/samples/default/mac/npmac.cpp @@ -4,6 +4,8 @@ // //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +#include + #include #include #include @@ -22,7 +24,7 @@ // A4Stuff does not exist as of CW 7. Define them to nothing. // -#if defined(__MWERKS__) && (__MWERKS__ >= 0x2400) +#if (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) || defined(__GNUC__) #define EnterCodeResource() #define ExitCodeResource() #else @@ -55,7 +57,7 @@ #endif #endif -// The following fix for static initializers (which fixes a preious +// The following fix for static initializers (which fixes a previous // incompatibility with some parts of PowerPlant, was submitted by // Jan Ulbrich. #ifdef __MWERKS__ @@ -78,7 +80,7 @@ // Define PLUGIN_TRACE to 1 to have the wrapper functions emit // DebugStr messages whenever they are called. // -#define PLUGIN_TRACE 0 +//#define PLUGIN_TRACE 1 #if PLUGIN_TRACE #define PLUGINDEBUGSTR(msg) ::DebugStr(msg) @@ -87,8 +89,91 @@ #endif +#ifdef XP_MACOSX + +// glue for mapping outgoing Macho function pointers to TVectors +struct TFPtoTVGlue{ + void* glue[2]; +}; + +struct { + TFPtoTVGlue newp; + TFPtoTVGlue destroy; + TFPtoTVGlue setwindow; + TFPtoTVGlue newstream; + TFPtoTVGlue destroystream; + TFPtoTVGlue asfile; + TFPtoTVGlue writeready; + TFPtoTVGlue write; + TFPtoTVGlue print; + TFPtoTVGlue event; + TFPtoTVGlue urlnotify; + TFPtoTVGlue getvalue; + TFPtoTVGlue setvalue; + + TFPtoTVGlue shutdown; +} gPluginFuncsGlueTable; + +static inline void* SetupFPtoTVGlue(TFPtoTVGlue* functionGlue, void* fp) +{ + functionGlue->glue[0] = fp; + functionGlue->glue[1] = 0; + return functionGlue; +} + +#define PLUGIN_TO_HOST_GLUE(name, fp) (SetupFPtoTVGlue(&gPluginFuncsGlueTable.name, (void*)fp)) + +// glue for mapping netscape TVectors to Macho function pointers +struct TTVtoFPGlue { + uint32 glue[6]; +}; + +struct { + TTVtoFPGlue geturl; + TTVtoFPGlue posturl; + TTVtoFPGlue requestread; + TTVtoFPGlue newstream; + TTVtoFPGlue write; + TTVtoFPGlue destroystream; + TTVtoFPGlue status; + TTVtoFPGlue uagent; + TTVtoFPGlue memalloc; + TTVtoFPGlue memfree; + TTVtoFPGlue memflush; + TTVtoFPGlue reloadplugins; + TTVtoFPGlue getJavaEnv; + TTVtoFPGlue getJavaPeer; + TTVtoFPGlue geturlnotify; + TTVtoFPGlue posturlnotify; + TTVtoFPGlue getvalue; + TTVtoFPGlue setvalue; + TTVtoFPGlue invalidaterect; + TTVtoFPGlue invalidateregion; + TTVtoFPGlue forceredraw; +} gNetscapeFuncsGlueTable; + +static void* SetupTVtoFPGlue(TTVtoFPGlue* functionGlue, void* tvp) +{ + static const TTVtoFPGlue glueTemplate = { 0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420 }; + + memcpy(functionGlue, &glueTemplate, sizeof(TTVtoFPGlue)); + functionGlue->glue[0] |= ((UInt32)tvp >> 16); + functionGlue->glue[1] |= ((UInt32)tvp & 0xFFFF); + ::MakeDataExecutable(functionGlue, sizeof(TTVtoFPGlue)); + return functionGlue; +} + +#define HOST_TO_PLUGIN_GLUE(name, fp) (SetupTVtoFPGlue(&gNetscapeFuncsGlueTable.name, (void*)fp)) + +#else + +#define PLUGIN_TO_HOST_GLUE(name, fp) (fp) +#define HOST_TO_PLUGIN_GLUE(name, fp) (fp) + +#endif /* XP_MACOSX */ +#pragma mark - //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -103,7 +188,6 @@ QDGlobals* gQDPtr; // Pointer to Netscape short gResFile; // Refnum of the pluginŐs resource file NPNetscapeFuncs gNetscapeFuncs; // Function table for procs in Netscape called by plugin - //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // // Wrapper functions for all calls from the plugin to Netscape. @@ -284,6 +368,8 @@ void NPN_ForceRedraw(NPP instance) CallNPN_ForceRedrawProc( gNetscapeFuncs.forceredraw, instance); } +#pragma mark - + //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // // Wrapper functions for all calls from Netscape to the plugin. @@ -326,7 +412,9 @@ void Private_Shutdown(void) PLUGINDEBUGSTR("\pShutdown;g;"); NPP_Shutdown(); +#ifdef __MWERKS__ __destroy_global_chain(); +#endif ExitCodeResource(); } @@ -456,8 +544,16 @@ jobject Private_GetJavaClass(void) void SetUpQD(void); void SetUpQD(void) { +#if !TARGET_API_MAC_CARBON + ProcessSerialNumber PSN; + FSSpec myFSSpec; + Str63 name; + ProcessInfoRec infoRec; OSErr result = noErr; - + CFragConnectionID connID; + Str255 errName; +#endif + // // Memorize the pluginŐs resource file // refnum for later use. @@ -540,8 +636,12 @@ void SetUpQD(void) } - +#ifdef __GNUC__ +// gcc requires that main have an 'int' return type +int main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp); +#else NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp); +#endif #if !TARGET_API_MAC_CARBON #pragma export on @@ -551,12 +651,18 @@ RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, ma #pragma export off #endif /* !TARGET_API_MAC_CARBON */ +#ifdef __GNUC__ +DEFINE_API_C(int) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp) +#else DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp) +#endif { EnterCodeResource(); PLUGINDEBUGSTR("\pmain"); +#ifdef __MWERKS__ __InitCode__(); +#endif NPError err = NPERR_NO_ERROR; @@ -592,62 +698,63 @@ DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, int navMinorVers = nsTable->version & 0xFF; - gNetscapeFuncs.version = nsTable->version; - gNetscapeFuncs.size = nsTable->size; - gNetscapeFuncs.posturl = nsTable->posturl; - gNetscapeFuncs.geturl = nsTable->geturl; - gNetscapeFuncs.requestread = nsTable->requestread; - gNetscapeFuncs.newstream = nsTable->newstream; - gNetscapeFuncs.write = nsTable->write; - gNetscapeFuncs.destroystream = nsTable->destroystream; - gNetscapeFuncs.status = nsTable->status; - gNetscapeFuncs.uagent = nsTable->uagent; - gNetscapeFuncs.memalloc = nsTable->memalloc; - gNetscapeFuncs.memfree = nsTable->memfree; - gNetscapeFuncs.memflush = nsTable->memflush; - gNetscapeFuncs.reloadplugins = nsTable->reloadplugins; + gNetscapeFuncs.version = nsTable->version; + gNetscapeFuncs.size = nsTable->size; + gNetscapeFuncs.posturl = (NPN_PostURLUPP)HOST_TO_PLUGIN_GLUE(posturl, nsTable->posturl); + gNetscapeFuncs.geturl = (NPN_GetURLUPP)HOST_TO_PLUGIN_GLUE(geturl, nsTable->geturl); + gNetscapeFuncs.requestread = (NPN_RequestReadUPP)HOST_TO_PLUGIN_GLUE(requestread, nsTable->requestread); + gNetscapeFuncs.newstream = (NPN_NewStreamUPP)HOST_TO_PLUGIN_GLUE(newstream, nsTable->newstream); + gNetscapeFuncs.write = (NPN_WriteUPP)HOST_TO_PLUGIN_GLUE(write, nsTable->write); + gNetscapeFuncs.destroystream = (NPN_DestroyStreamUPP)HOST_TO_PLUGIN_GLUE(destroystream, nsTable->destroystream); + gNetscapeFuncs.status = (NPN_StatusUPP)HOST_TO_PLUGIN_GLUE(status, nsTable->status); + gNetscapeFuncs.uagent = (NPN_UserAgentUPP)HOST_TO_PLUGIN_GLUE(uagent, nsTable->uagent); + gNetscapeFuncs.memalloc = (NPN_MemAllocUPP)HOST_TO_PLUGIN_GLUE(memalloc, nsTable->memalloc); + gNetscapeFuncs.memfree = (NPN_MemFreeUPP)HOST_TO_PLUGIN_GLUE(memfree, nsTable->memfree); + gNetscapeFuncs.memflush = (NPN_MemFlushUPP)HOST_TO_PLUGIN_GLUE(memflush, nsTable->memflush); + gNetscapeFuncs.reloadplugins = (NPN_ReloadPluginsUPP)HOST_TO_PLUGIN_GLUE(reloadplugins, nsTable->reloadplugins); if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) { - gNetscapeFuncs.getJavaEnv = nsTable->getJavaEnv; - gNetscapeFuncs.getJavaPeer = nsTable->getJavaPeer; + gNetscapeFuncs.getJavaEnv = (NPN_GetJavaEnvUPP)HOST_TO_PLUGIN_GLUE(getJavaEnv, nsTable->getJavaEnv); + gNetscapeFuncs.getJavaPeer = (NPN_GetJavaPeerUPP)HOST_TO_PLUGIN_GLUE(getJavaPeer, nsTable->getJavaPeer); } if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { - gNetscapeFuncs.geturlnotify = nsTable->geturlnotify; - gNetscapeFuncs.posturlnotify = nsTable->posturlnotify; + gNetscapeFuncs.geturlnotify = (NPN_GetURLNotifyUPP)HOST_TO_PLUGIN_GLUE(geturlnotify, nsTable->geturlnotify); + gNetscapeFuncs.posturlnotify = (NPN_PostURLNotifyUPP)HOST_TO_PLUGIN_GLUE(posturlnotify, nsTable->posturlnotify); } - gNetscapeFuncs.getvalue = nsTable->getvalue; - gNetscapeFuncs.setvalue = nsTable->setvalue; - gNetscapeFuncs.invalidaterect = nsTable->invalidaterect; - gNetscapeFuncs.invalidateregion = nsTable->invalidateregion; - gNetscapeFuncs.forceredraw = nsTable->forceredraw; + gNetscapeFuncs.getvalue = (NPN_GetValueUPP)HOST_TO_PLUGIN_GLUE(getvalue, nsTable->getvalue); + gNetscapeFuncs.setvalue = (NPN_SetValueUPP)HOST_TO_PLUGIN_GLUE(setvalue, nsTable->setvalue); + gNetscapeFuncs.invalidaterect = (NPN_InvalidateRectUPP)HOST_TO_PLUGIN_GLUE(invalidaterect, nsTable->invalidaterect); + gNetscapeFuncs.invalidateregion = (NPN_InvalidateRegionUPP)HOST_TO_PLUGIN_GLUE(invalidateregion, nsTable->invalidateregion); + gNetscapeFuncs.forceredraw = (NPN_ForceRedrawUPP)HOST_TO_PLUGIN_GLUE(forceredraw, nsTable->forceredraw); // // Set up the plugin function table that Netscape will use to // call us. Netscape needs to know about our version and size // and have a UniversalProcPointer for every function we implement. // - pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR; - pluginFuncs->size = sizeof(NPPluginFuncs); - pluginFuncs->newp = NewNPP_NewProc(Private_New); - pluginFuncs->destroy = NewNPP_DestroyProc(Private_Destroy); - pluginFuncs->setwindow = NewNPP_SetWindowProc(Private_SetWindow); - pluginFuncs->newstream = NewNPP_NewStreamProc(Private_NewStream); - pluginFuncs->destroystream = NewNPP_DestroyStreamProc(Private_DestroyStream); - pluginFuncs->asfile = NewNPP_StreamAsFileProc(Private_StreamAsFile); - pluginFuncs->writeready = NewNPP_WriteReadyProc(Private_WriteReady); - pluginFuncs->write = NewNPP_WriteProc(Private_Write); - pluginFuncs->print = NewNPP_PrintProc(Private_Print); - pluginFuncs->event = NewNPP_HandleEventProc(Private_HandleEvent); + pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR; + pluginFuncs->size = sizeof(NPPluginFuncs); + pluginFuncs->newp = NewNPP_NewProc(PLUGIN_TO_HOST_GLUE(newp, Private_New)); + pluginFuncs->destroy = NewNPP_DestroyProc(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy)); + pluginFuncs->setwindow = NewNPP_SetWindowProc(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow)); + pluginFuncs->newstream = NewNPP_NewStreamProc(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream)); + pluginFuncs->destroystream = NewNPP_DestroyStreamProc(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream)); + pluginFuncs->asfile = NewNPP_StreamAsFileProc(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile)); + pluginFuncs->writeready = NewNPP_WriteReadyProc(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady)); + pluginFuncs->write = NewNPP_WriteProc(PLUGIN_TO_HOST_GLUE(write, Private_Write)); + pluginFuncs->print = NewNPP_PrintProc(PLUGIN_TO_HOST_GLUE(print, Private_Print)); + pluginFuncs->event = NewNPP_HandleEventProc(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent)); if( navMinorVers >= NPVERS_HAS_NOTIFICATION ) { - pluginFuncs->urlnotify = NewNPP_URLNotifyProc(Private_URLNotify); + pluginFuncs->urlnotify = NewNPP_URLNotifyProc(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify)); } if( navMinorVers >= NPVERS_HAS_LIVECONNECT ) { pluginFuncs->javaClass = (JRIGlobalRef) Private_GetJavaClass(); } - *unloadUpp = NewNPP_ShutdownProc(Private_Shutdown); + *unloadUpp = NewNPP_ShutdownProc(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown)); + SetUpQD(); err = Private_Initialize(); }