Rebased ref, commits from common ancestor: commit a25bb747b285a5b0e56b7eb502950a90203c4dee Author: Douglas Mencken <dougmenc...@gmail.com> Date: Sun Oct 18 11:29:49 2015 -0400
vcx.osx.print: convert to use modern API Change-Id: Icc7d7ad95d1ffbf55f1cd704148f3ceb58618e6c diff --git a/vcl/inc/osx/printview.h b/vcl/inc/osx/printview.h index b63900b..ef8b891 100644 --- a/vcl/inc/osx/printview.h +++ b/vcl/inc/osx/printview.h @@ -45,7 +45,8 @@ struct PrintAccessoryViewState vcl::PrinterController* mpController; AquaSalInfoPrinter* mpInfoPrinter; } --(id)initWithController: (vcl::PrinterController*)pController withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter; +-(id)initWithController: (vcl::PrinterController*)pController + withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter; -(BOOL)knowsPageRange: (NSRangePointer)range; -(NSRect)rectForPage: (int)page; -(NSPoint)locationOfPrintRect: (NSRect)aRect; @@ -55,7 +56,9 @@ struct PrintAccessoryViewState @interface AquaPrintAccessoryView : NSObject { } -+(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp withController: (vcl::PrinterController*)pController withState: (PrintAccessoryViewState*)pState; ++(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp + withController: (vcl::PrinterController*)pController + withState: (PrintAccessoryViewState*)pState; @end #endif // INCLUDED_VCL_INC_OSX_PRINTVIEW_H diff --git a/vcl/osx/printaccessoryview.mm b/vcl/osx/printaccessoryview.mm index d03d4f4..ee5d1e9 100644 --- a/vcl/osx/printaccessoryview.mm +++ b/vcl/osx/printaccessoryview.mm @@ -45,11 +45,15 @@ using namespace com::sun::star; using namespace com::sun::star::beans; using namespace com::sun::star::uno; -/* Note: the accessory view as implemented here is already deprecated in Leopard. Unfortunately - as long as our baseline is Tiger we cannot gain the advantages over multiple accessory views - as well havs having accessory views AND a preview (as long as you are linked vs. 10.4 libraries - the preview insists on not being present. This is unfortunate. -*/ +#if MACOSX_SDK_VERSION <= 1040 +// as long as you are linking with 10.4 libraries there's no preview +# define VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG +# undef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG +#else +// since 10.5 you can use multiple accessory views and have accessory views and a preview +# define MODERN_IMPLEMENTATION_OF_PRINT_DIALOG +# undef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG +#endif class ControllerProperties; @@ -60,10 +64,98 @@ class ControllerProperties; -(id)initWithControllerMap: (ControllerProperties*)pController; -(void)triggered:(id)pSender; -(void)triggeredNumeric:(id)pSender; +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG -(void)triggeredPreview:(id)pSender; +#endif -(void)dealloc; @end +#ifdef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG + +@interface AquaPrintPanelAccessoryController : NSViewController< NSPrintPanelAccessorizing > + +NSPrintOperation *mpPrintOperation; +vcl::PrinterController *mpController; +PrintAccessoryViewState *mpState; + +-(void)forPrintOperation:(NSPrintOperation*)pPrintOp; +-(void)withController:(vcl::PrinterController*)pController; +-(void)withState:(PrintAccessoryViewState*)pState; + +-(NSSet*)keyPathsForValuesAffectingPreview; +-(NSArray*)localizedSummaryItems; + +-(sal_Int32)updatePrintOperation:(sal_Int32)pLastPageCount; + +@end + +@implementation AquaPrintPanelAccessoryController + +-(void)forPrintOperation:(NSPrintOperation*)pPrintOp +{ + mpPrintOperation = pPrintOp; +} + +-(void)withController:(vcl::PrinterController*)pController +{ + mpController = pController; +} + +-(void)withState:(PrintAccessoryViewState*)pState +{ + mpState = pState; +} + +-(NSSet*)keyPathsForValuesAffectingPreview +{ + return [ NSSet setWithObject:@"updatePrintOperation" ]; +} + +-(NSArray*)localizedSummaryItems +{ + return [ NSArray arrayWithObject: + [ NSDictionary dictionary ] ]; +} + +-(sal_Int32)updatePrintOperation:(sal_Int32)pLastPageCount +{ + // page range may be changed by option choice + sal_Int32 nPages = mpController->getFilteredPageCount(); + + mpState->bNeedRestart = false; + if( nPages != pLastPageCount ) + { + #if OSL_DEBUG_LEVEL > 1 + SAL_INFO( "vcl.osx.print", "number of pages changed" << + " from " << pLastPageCount << " to " << nPages ); + #endif + mpState->bNeedRestart = true; + } + + NSTabView* pTabView = [[[self view] subviews] objectAtIndex:0]; + NSTabViewItem* pItem = [pTabView selectedTabViewItem]; + if( pItem ) + mpState->nLastPage = [pTabView indexOfTabViewItem: pItem]; + else + mpState->nLastPage = 0; + + if( mpState->bNeedRestart ) + { + // AppKit does not give a chance of changing the page count + // and don't let cancel the dialog either + // hack: send a cancel message to the modal window displaying views + NSWindow* pNSWindow = [NSApp modalWindow]; + if( pNSWindow ) + [pNSWindow cancelOperation: nil]; + [[mpPrintOperation printInfo] setJobDisposition: NSPrintCancelJob]; + } + + return nPages; +} + +@end + +#endif class ControllerProperties { @@ -74,79 +166,95 @@ class ControllerProperties std::vector< NSObject* > maViews; int mnNextTag; sal_Int32 mnLastPageCount; - PrintAccessoryViewState* mpState; NSPrintOperation* mpOp; + PrintAccessoryViewState* mpState; + ResStringArray maLocalizedStrings; +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + NSBox* mpPreviewBox; + NSImageView* mpPreview; // print preview is not provided "by default" NSView* mpAccessoryView; NSTabView* mpTabView; - NSBox* mpPreviewBox; - NSImageView* mpPreview; NSTextField* mpPageEdit; NSStepper* mpStepper; - NSTextView* mpPagesLabel; - ResStringArray maLocalizedStrings; +#else + AquaPrintPanelAccessoryController* mpAccessoryController; +#endif public: - ControllerProperties( vcl::PrinterController* i_pController, - NSPrintOperation* i_pOp, - NSView* i_pAccessoryView, - NSTabView* i_pTabView, - PrintAccessoryViewState* i_pState ) - : mpController( i_pController ), - mnNextTag( 0 ), - mnLastPageCount( i_pController->getFilteredPageCount() ), - mpState( i_pState ), - mpOp( i_pOp ), - mpAccessoryView( i_pAccessoryView ), - mpTabView( i_pTabView ), - mpPreviewBox( nil ), - mpPreview( nil ), - mpPageEdit( nil ), - mpStepper( nil ), - mpPagesLabel( nil ), - maLocalizedStrings( VclResId( SV_PRINT_NATIVE_STRINGS ) ) + ControllerProperties( vcl::PrinterController* i_pController + , NSPrintOperation* i_pOp + , PrintAccessoryViewState* i_pState +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + , NSView* i_pAccessoryView + , NSTabView* i_pTabView +#else + , AquaPrintPanelAccessoryController* i_pAccessoryController +#endif + ) + : mpController( i_pController ) + , mnNextTag( 0 ) + , mnLastPageCount( i_pController->getFilteredPageCount() ) + , mpOp( i_pOp ) + , mpState( i_pState ) + , maLocalizedStrings( VclResId( SV_PRINT_NATIVE_STRINGS ) ) +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + , mpPreviewBox( nil ) + , mpPreview( nil ) + , mpAccessoryView( i_pAccessoryView ) + , mpTabView( i_pTabView ) + , mpPageEdit( nil ) + , mpStepper( nil ) +#else + , mpAccessoryController( i_pAccessoryController ) +#endif { - mpState->bNeedRestart = false; - DBG_ASSERT( maLocalizedStrings.Count() >= 5, "resources not found !" ); + //mpState->bNeedRestart = false; + assert( maLocalizedStrings.Count() >= 5 && "resources not found" ); } - + rtl::OUString getMoreString() { return maLocalizedStrings.Count() >= 4 ? OUString( maLocalizedStrings.GetString( 3 ) ) : OUString( "More" ); } - + rtl::OUString getPrintSelectionString() { return maLocalizedStrings.Count() >= 5 ? OUString( maLocalizedStrings.GetString( 4 ) ) : OUString( "Print selection only" ); } - + +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG void updatePrintJob() { - // TODO: refresh page count etc from mpController - - // page range may have changed depending on options + // page range may be changed by option choice sal_Int32 nPages = mpController->getFilteredPageCount(); - #if OSL_DEBUG_LEVEL > 1 + + mpState->bNeedRestart = false; if( nPages != mnLastPageCount ) - fprintf( stderr, "trouble: number of pages changed from %ld to %ld !\n", mnLastPageCount, nPages ); - #endif - mpState->bNeedRestart = (nPages != mnLastPageCount); + { + #if OSL_DEBUG_LEVEL > 1 + SAL_INFO( "vcl.osx.print", "number of pages changed" << + " from " << mnLastPageCount << " to " << nPages ); + #endif + mpState->bNeedRestart = true; + } + mnLastPageCount = nPages; + NSTabViewItem* pItem = [mpTabView selectedTabViewItem]; if( pItem ) mpState->nLastPage = [mpTabView indexOfTabViewItem: pItem]; else mpState->nLastPage = 0; - mnLastPageCount = nPages; + if( mpState->bNeedRestart ) { - // Warning: bad hack ahead - // Apple does not give us a chance of changing the page count, - // and they don't let us cancel the dialog either - // hack: send a cancel message to the window displaying our views. - // this is ugly. + // Warning: bad ugly hack ahead + // AppKit does not give a chance of changing the page count + // and don't let cancel the dialog either + // hack: send a cancel message to the modal window displaying views NSWindow* pNSWindow = [NSApp modalWindow]; if( pNSWindow ) [pNSWindow cancelOperation: nil]; @@ -158,7 +266,8 @@ class ControllerProperties updatePreviewImage( nPage-1 ); } } - +#endif + int addNameTag( const rtl::OUString& i_rPropertyName ) { int nNewTag = mnNextTag++; @@ -173,18 +282,18 @@ class ControllerProperties maTagToValueInt[ nNewTag ] = i_nValue; return nNewTag; } - + void addObservedControl( NSObject* i_pView ) { maViews.push_back( i_pView ); } - + void addViewPair( NSView* i_pLeft, NSView* i_pRight ) { maViewPairMap[ i_pLeft ] = i_pRight; maViewPairMap[ i_pRight ] = i_pLeft; } - + NSView* getPair( NSView* i_pLeft ) const { NSView* pRight = nil; @@ -193,7 +302,7 @@ class ControllerProperties pRight = it->second; return pRight; } - + void changePropertyWithIntValue( int i_nTag ) { std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag ); @@ -204,7 +313,11 @@ class ControllerProperties if( pVal ) { pVal->Value <<= value_it->second; +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG updatePrintJob(); +#else + mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount]; +#endif } } } @@ -218,11 +331,15 @@ class ControllerProperties if( pVal ) { pVal->Value <<= i_nValue; +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG updatePrintJob(); +#else + mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount]; +#endif } } } - + void changePropertyWithBoolValue( int i_nTag, bool i_bValue ) { std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag ); @@ -236,11 +353,15 @@ class ControllerProperties pVal->Value <<= i_bValue ? sal_Int32(2) : sal_Int32(0); else pVal->Value <<= i_bValue; - updatePrintJob(); +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + updatePrintJob(); +#else + mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount]; +#endif } } } - + void changePropertyWithStringValue( int i_nTag, const rtl::OUString& i_rValue ) { std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( i_nTag ); @@ -250,11 +371,15 @@ class ControllerProperties if( pVal ) { pVal->Value <<= i_rValue; - updatePrintJob(); +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + updatePrintJob(); +#else + mnLastPageCount = [mpAccessoryController updatePrintOperation: mnLastPageCount]; +#endif } } } - + void updateEnableState() { for( std::vector< NSObject* >::iterator it = maViews.begin(); it != maViews.end(); ++it ) @@ -266,11 +391,11 @@ class ControllerProperties pCtrl = (NSControl*)pObj; else if( [pObj isKindOfClass: [NSCell class]] ) pCell = (NSCell*)pObj; - + int nTag = pCtrl ? [pCtrl tag] : pCell ? [pCell tag] : -1; - + std::map< int, rtl::OUString >::const_iterator name_it = maTagToPropertyName.find( nTag ); if( name_it != maTagToPropertyName.end() && ! name_it->second.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("PrintContent")) ) { @@ -284,11 +409,12 @@ class ControllerProperties } else if( pCell ) [pCell setEnabled: bEnabled]; - } } } - + +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + void updatePreviewImage( sal_Int32 i_nPage ) { sal_Int32 nPages = mpController->getFilteredPageCount(); @@ -339,7 +465,7 @@ class ControllerProperties { if( maLocalizedStrings.Count() < 3 ) return; - + // get the preview control NSRect aPreviewFrame = [mpAccessoryView frame]; aPreviewFrame.origin.x = 0; @@ -363,24 +489,24 @@ class ControllerProperties [mpPreview setImageAlignment: NSImageAlignCenter]; [mpPreview setImageFrameStyle: NSImageFrameNone]; [mpPreviewBox addSubview: [mpPreview autorelease]]; - + // add a label sal_Int32 nPages = mpController->getFilteredPageCount(); rtl::OUStringBuffer aBuf( 16 ); aBuf.append( "/ " ); aBuf.append( rtl::OUString::number( nPages ) ); - + NSString* pText = CreateNSString( aBuf.makeStringAndClear() ); NSRect aTextRect = { { 100, 5 }, { 100, 22 } }; - mpPagesLabel = [[NSTextView alloc] initWithFrame: aTextRect]; - [mpPagesLabel setFont: [NSFont controlContentFontOfSize: 0]]; - [mpPagesLabel setEditable: NO]; - [mpPagesLabel setSelectable: NO]; - [mpPagesLabel setDrawsBackground: NO]; - [mpPagesLabel setString: [pText autorelease]]; - [mpPagesLabel setToolTip: [CreateNSString( maLocalizedStrings.GetString( 2 ) ) autorelease]]; - [mpPreviewBox addSubview: [mpPagesLabel autorelease]]; - + NSTextView* aPagesLabel = [[NSTextView alloc] initWithFrame: aTextRect]; + [aPagesLabel setFont: [NSFont controlContentFontOfSize: 0]]; + [aPagesLabel setEditable: NO]; + [aPagesLabel setSelectable: NO]; + [aPagesLabel setDrawsBackground: NO]; + [aPagesLabel setString: [pText autorelease]]; + [aPagesLabel setToolTip: [CreateNSString( maLocalizedStrings.GetString( 2 ) ) autorelease]]; + [mpPreviewBox addSubview: [aPagesLabel autorelease]]; + NSRect aFieldRect = { { 45, 5 }, { 35, 25 } }; mpPageEdit = [[NSTextField alloc] initWithFrame: aFieldRect]; [mpPageEdit setEditable: YES]; @@ -388,14 +514,14 @@ class ControllerProperties [mpPageEdit setDrawsBackground: YES]; [mpPageEdit setToolTip: [CreateNSString( maLocalizedStrings.GetString( 1 ) ) autorelease]]; [mpPreviewBox addSubview: [mpPageEdit autorelease]]; - + // add a stepper control NSRect aStepFrame = { { 85, 5 }, { 15, 25 } }; mpStepper = [[NSStepper alloc] initWithFrame: aStepFrame]; [mpStepper setIncrement: 1]; [mpStepper setValueWraps: NO]; [mpPreviewBox addSubview: [mpStepper autorelease]]; - + // constrain the text field to decimal numbers NSNumberFormatter* pFormatter = [[NSNumberFormatter alloc] init]; [pFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; @@ -407,16 +533,16 @@ class ControllerProperties [mpPageEdit setFormatter: pFormatter]; [mpStepper setMinValue: 1]; [mpStepper setMaxValue: nPages]; - + [mpPageEdit setIntValue: 1]; [mpStepper setIntValue: 1]; - + // connect target and action [mpStepper setTarget: i_pCtrlTarget]; [mpStepper setAction: @selector(triggeredPreview:)]; [mpPageEdit setTarget: i_pCtrlTarget]; [mpPageEdit setAction: @selector(triggeredPreview:)]; - + // set first preview image updatePreviewImage( 0 ); } @@ -444,6 +570,9 @@ class ControllerProperties } } } + +#endif + }; static OUString filterAccelerator( rtl::OUString const & rText ) @@ -455,6 +584,7 @@ static OUString filterAccelerator( rtl::OUString const & rText ) } @implementation ControlTarget + -(id)initWithControllerMap: (ControllerProperties*)pController { if( (self = [super init]) ) @@ -463,6 +593,7 @@ static OUString filterAccelerator( rtl::OUString const & rText ) } return self; } + -(void)triggered:(id)pSender { if( [pSender isMemberOfClass: [NSPopUpButton class]] ) @@ -500,10 +631,12 @@ static OUString filterAccelerator( rtl::OUString const & rText ) } else { - SAL_INFO( "vcl.osx.print", "Unsupported class" << ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil")); + SAL_INFO( "vcl.osx.print", "Unsupported class" << + ( [pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil" ) ); } mpController->updateEnableState(); } + -(void)triggeredNumeric:(id)pSender { if( [pSender isMemberOfClass: [NSTextField class]] ) @@ -532,19 +665,25 @@ static OUString filterAccelerator( rtl::OUString const & rText ) } else { - SAL_INFO( "vcl.osx.print", "Unsupported class" << ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil")); + SAL_INFO( "vcl.osx.print", "Unsupported class" << + ([pSender class] ? [NSStringFromClass([pSender class]) UTF8String] : "nil") ); } mpController->updateEnableState(); } + +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG -(void)triggeredPreview:(id)pSender { mpController->changePreview( pSender ); } +#endif + -(void)dealloc { delete mpController; [super dealloc]; } + @end struct ColumnItem @@ -584,7 +723,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize, ) { // balance columns - + // first get overall column widths long nLeftWidth = 0; long nRightWidth = 0; @@ -600,7 +739,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize, if( nW > nRightWidth ) nRightWidth = nW; } - + // right align left column for( size_t i = 0; i < rLeftColumn.size(); i++ ) { @@ -637,7 +776,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize, [rRightColumn[i].pControl setFrame: aCtrlRect]; } } - + NSArray* pSubViews = [pNSView subviews]; unsigned int nViews = [pSubViews count]; NSRect aUnion = NSZeroRect; @@ -647,7 +786,7 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize, { aUnion = NSUnionRect( aUnion, [[pSubViews objectAtIndex: n] frame] ); } - + // move everything so it will fit for( unsigned int n = 0; n < nViews; n++ ) { @@ -657,12 +796,12 @@ static void adjustViewAndChildren( NSView* pNSView, NSSize& rMaxSize, aFrame.origin.y -= aUnion.origin.y - 5; [pCurSubView setFrame: aFrame]; } - + // resize the view itself aUnion.size.height += 10; aUnion.size.width += 20; [pNSView setFrameSize: aUnion.size]; - + if( aUnion.size.width > rMaxSize.width ) rMaxSize.width = aUnion.size.width; if( aUnion.size.height > rMaxSize.height ) @@ -728,10 +867,11 @@ static sal_Int32 findBreak( const rtl::OUString& i_rText, sal_Int32 i_nPos ) Reference< i18n::XBreakIterator > xBI( vcl::unohelper::CreateBreakIterator() ); if( xBI.is() ) { - i18n::Boundary aBoundary = xBI->getWordBoundary( i_rText, i_nPos, - Application::GetSettings().GetLanguageTag().getLocale(), - i18n::WordType::ANYWORD_IGNOREWHITESPACES, - sal_True ); + i18n::Boundary aBoundary = + xBI->getWordBoundary( i_rText, i_nPos, + Application::GetSettings().GetLanguageTag().getLocale(), + i18n::WordType::ANYWORD_IGNOREWHITESPACES, + true ); nRet = aBoundary.endPos; } return nRet; @@ -855,7 +995,9 @@ static void addRadio( NSView* pCurParent, long& rCurX, long& rCurY, long nAttach // setup radio matrix NSButtonCell* pProto = [[NSButtonCell alloc] init]; - NSRect aRadioRect = { { static_cast<CGFloat>(rCurX + nOff), 0 }, { static_cast<CGFloat>(280 - rCurX), static_cast<CGFloat>(5*rChoices.getLength()) } }; + NSRect aRadioRect = { { static_cast<CGFloat>(rCurX + nOff), 0 }, + { static_cast<CGFloat>(280 - rCurX), + static_cast<CGFloat>(5*rChoices.getLength()) } }; [pProto setTitle: @"RadioButtonGroup"]; [pProto setButtonType: NSRadioButton]; NSMatrix* pMatrix = [[NSMatrix alloc] initWithFrame: aRadioRect @@ -1079,43 +1221,56 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO rCurY = aFieldRect.origin.y - 5; } -// In 10.5 and later: -// 'setAccessoryView:' is deprecated - -// Make deprecation warnings just warnings in a -Werror compilation. - -#ifdef __GNUC__ -// #pragma GCC diagnostic push -#pragma GCC diagnostic warning "-Wdeprecated-declarations" -#endif - @implementation AquaPrintAccessoryView -+(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp withController: (vcl::PrinterController*)pController withState: (PrintAccessoryViewState*)pState + ++(NSObject*)setupPrinterPanel: (NSPrintOperation*)pOp + withController: (vcl::PrinterController*)pController + withState: (PrintAccessoryViewState*)pState { const Sequence< PropertyValue >& rOptions( pController->getUIOptions() ); if( rOptions.getLength() == 0 ) return nil; + NSRect aViewFrame = { NSZeroPoint, { 600, 400 } }; +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + NSRect aTabViewFrame = { { 190, 0 }, { 410, 400 } }; +#else + NSRect aTabViewFrame = aViewFrame; +#endif + + NSView* pAccessoryView = [[NSView alloc] initWithFrame: aViewFrame]; + NSTabView* pTabView = [[NSTabView alloc] initWithFrame: aTabViewFrame]; + [pAccessoryView addSubview: [pTabView autorelease]]; + +#ifdef MODERN_IMPLEMENTATION_OF_PRINT_DIALOG + // create the accessory controller + AquaPrintPanelAccessoryController* pAccessoryController = + [[AquaPrintPanelAccessoryController alloc] initWithNibName: nil bundle: nil]; + [pAccessoryController setView: [pAccessoryView autorelease]]; + [pAccessoryController forPrintOperation: pOp]; + [pAccessoryController withController: pController]; + [pAccessoryController withState: pState]; +#endif + NSView* pCurParent = 0; long nCurY = 0; long nCurX = 0; - NSRect aViewFrame = { NSZeroPoint, {600, 400 } }; - NSRect aTabViewFrame = { { 190, 0 }, {410, 400 } }; NSSize aMaxTabSize = NSZeroSize; - NSView* pAccessoryView = [[NSView alloc] initWithFrame: aViewFrame]; - NSTabView* pTabView = [[NSTabView alloc] initWithFrame: aTabViewFrame]; - [pAccessoryView addSubview: [pTabView autorelease]]; - - bool bIgnoreSubgroup = false; - - ControllerProperties* pControllerProperties = new ControllerProperties( pController, pOp, pAccessoryView, pTabView, pState ); + + ControllerProperties* pControllerProperties = +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + new ControllerProperties( pController, pOp, pState, pAccessoryView, pTabView ); +#else + new ControllerProperties( pController, pOp, pState, pAccessoryController ); +#endif ControlTarget* pCtrlTarget = [[ControlTarget alloc] initWithControllerMap: pControllerProperties]; - + std::vector< ColumnItem > aLeftColumn, aRightColumn; - + // ugly: // prepend a "selection" checkbox if the properties have such a selection in PrintContent bool bAddSelectionCheckBox = false, bSelectionBoxEnabled = false, bSelectionBoxChecked = false; + for( int i = 0; i < rOptions.getLength(); i++ ) { Sequence< beans::PropertyValue > aOptProp; @@ -1167,15 +1322,15 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO rOptions[i].Value >>= aOptProp; // extract ui element - bool bEnabled = true; rtl::OUString aCtrlType; rtl::OUString aText; rtl::OUString aPropertyName; rtl::OUString aGroupHint; Sequence< rtl::OUString > aChoices; + bool bEnabled = true; sal_Int64 nMinValue = 0, nMaxValue = 0; long nAttachOffset = 0; - sal_Bool bIgnore = sal_False; + bool bIgnore = false; for( int n = 0; n < aOptProp.getLength(); n++ ) { @@ -1203,7 +1358,7 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO { sal_Bool bValue = sal_True; rEntry.Value >>= bValue; - bEnabled = bValue; + bEnabled = bValue ? true : false; } else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("MinValue")) ) { @@ -1219,7 +1374,9 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO } else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("InternalUIOnly")) ) { - rEntry.Value >>= bIgnore; + sal_Bool bValue = sal_False; + rEntry.Value >>= bValue; + bIgnore = bValue ? true : false; } else if( rEntry.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("GroupingHint")) ) { @@ -1235,8 +1392,10 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range")) || aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Bool")) ) { - // since our build target is MacOSX 10.4 we can have only one accessory view - // so we have a single accessory view that is tabbed for grouping + bool bIgnoreSubgroup = false; + + // with `setAccessoryView' method only one accessory view can be set + // so create this single accessory view as tabbed for grouping if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Group")) || ! pCurParent || ( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) && nCurY < -250 && ! bIgnore ) @@ -1245,10 +1404,11 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO rtl::OUString aGroupTitle( aText ); if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) ) aGroupTitle = pControllerProperties->getMoreString(); + // set size of current parent if( pCurParent ) adjustViewAndChildren( pCurParent, aMaxTabSize, aLeftColumn, aRightColumn ); - + // new tab item if( ! aText.getLength() ) aText = "OOo"; @@ -1259,11 +1419,9 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO pCurParent = [[NSView alloc] initWithFrame: aTabViewFrame]; [pItem setView: pCurParent]; [pLabel release]; - - // reset indent - nCurX = 20; - // reset Y - nCurY = 0; + + nCurX = 20; // reset indent + nCurY = 0; // reset Y // clear columns aLeftColumn.clear(); aRightColumn.clear(); @@ -1277,7 +1435,7 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO bAddSelectionCheckBox = false; } } - + if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Subgroup")) && pCurParent ) { bIgnoreSubgroup = bIgnore; @@ -1292,12 +1450,12 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO } else if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Bool")) && pCurParent ) { - sal_Bool bVal = sal_False; + sal_Bool bVal = sal_False; PropertyValue* pVal = pController->getValue( aPropertyName ); if( pVal ) pVal->Value >>= bVal; addBool( pCurParent, nCurX, nCurY, nAttachOffset, - aText, true, aPropertyName, bVal, + aText, true, aPropertyName, bVal?true:false, aRightColumn, pControllerProperties, pCtrlTarget ); } else if( aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Radio")) && pCurParent ) @@ -1325,7 +1483,8 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO aLeftColumn, aRightColumn, pControllerProperties, pCtrlTarget ); } - else if( (aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Edit")) || aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range"))) && pCurParent ) + else if( (aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Edit")) + || aCtrlType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Range"))) && pCurParent ) { // current value PropertyValue* pVal = pController->getValue( aPropertyName ); @@ -1341,17 +1500,19 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO SAL_INFO( "vcl.osx.print", "Unsupported UI option \"" << aCtrlType << "\""); } } - + pControllerProperties->updateEnableState(); adjustViewAndChildren( pCurParent, aMaxTabSize, aLeftColumn, aRightColumn ); - - // leave some space for the preview + +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG + // leave some space for preview if( aMaxTabSize.height < 200 ) aMaxTabSize.height = 200; - +#endif + // now reposition everything again so it is upper bound adjustTabViews( pTabView, aMaxTabSize ); - + // find the minimum needed tab size NSSize aTabCtrlSize = [pTabView minimumSize]; aTabCtrlSize.height += aMaxTabSize.height + 10; @@ -1361,11 +1522,21 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO aViewFrame.size.width = aTabCtrlSize.width + aTabViewFrame.origin.x; aViewFrame.size.height = aTabCtrlSize.height + aTabViewFrame.origin.y; [pAccessoryView setFrameSize: aViewFrame.size]; - + +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG pControllerProperties->setupPreview( pCtrlTarget ); +#endif +#ifdef VINTAGE_IMPLEMENTATION_OF_PRINT_DIALOG // set the accessory view [pOp setAccessoryView: [pAccessoryView autorelease]]; +#else // -(void)setAccessoryView:(NSView *)aView of NSPrintOperation is deprecated since 10.5 + // get the print panel + NSPrintPanel* pPrintPanel = [pOp printPanel]; + [pPrintPanel setOptions: [pPrintPanel options] | NSPrintPanelShowsPreview]; + // add the accessory controller to the panel + [pPrintPanel addAccessoryController: [pAccessoryController autorelease]]; +#endif // set the current selecte tab item if( pState->nLastPage >= 0 && pState->nLastPage < [pTabView numberOfTabViewItems] ) @@ -1374,8 +1545,6 @@ static void addEdit( NSView* pCurParent, long& rCurX, long& rCurY, long nAttachO return pCtrlTarget; } -// #pragma GCC diagnostic pop - @end /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/osx/printview.mm b/vcl/osx/printview.mm index 8b324b9..3fef61d 100644 --- a/vcl/osx/printview.mm +++ b/vcl/osx/printview.mm @@ -24,7 +24,9 @@ #include "osx/salprn.h" @implementation AquaPrintView --(id)initWithController: (vcl::PrinterController*)pController withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter + +-(id)initWithController: (vcl::PrinterController*)pController + withInfoPrinter: (AquaSalInfoPrinter*)pInfoPrinter { NSRect aRect = { NSZeroPoint, [pInfoPrinter->getPrintInfo() paperSize] }; if( (self = [super initWithFrame: aRect]) != nil ) @@ -49,7 +51,9 @@ // #i101108# sanity check if( nWidth < 1 ) nWidth = 1; - NSRect aRect = { { static_cast<CGFloat>(page % nWidth), static_cast<CGFloat>(page / nWidth) }, aPaperSize }; + NSRect aRect = { { static_cast<CGFloat>(page % nWidth), + static_cast<CGFloat>(page / nWidth) }, + aPaperSize }; return aRect; } @@ -61,7 +65,8 @@ -(void)drawRect: (NSRect)rect { - mpInfoPrinter->setStartPageOffset( static_cast<int>(rect.origin.x), static_cast<int>(rect.origin.y) ); + mpInfoPrinter->setStartPageOffset( static_cast<int>(rect.origin.x), + static_cast<int>(rect.origin.y) ); NSSize aPaperSize = [mpInfoPrinter->getPrintInfo() paperSize]; int nPage = (int)(aPaperSize.width * rect.origin.y + rect.origin.x); @@ -69,6 +74,7 @@ if( nPage - 1 < (mpInfoPrinter->getCurPageRangeStart() + mpInfoPrinter->getCurPageRangeCount() ) ) mpController->printFilteredPage( nPage-1 ); } + @end /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/osx/salprn.cxx b/vcl/osx/salprn.cxx index 8ef58ad..f28d10e 100644 --- a/vcl/osx/salprn.cxx +++ b/vcl/osx/salprn.cxx @@ -503,8 +503,9 @@ bool AquaSalInfoPrinter::StartJob( const OUString* i_pFileName, bSuccess = true; mbJob = true; pInst->startedPrintJob(); - [pPrintOperation runOperation]; + BOOL wasSuccessful = [pPrintOperation runOperation]; pInst->endedPrintJob(); + bSuccess = wasSuccessful ? true : false; bWasAborted = [[[pPrintOperation printInfo] jobDisposition] compare: NSPrintCancelJob] == NSOrderedSame; mbJob = false; if( pReleaseAfterUse ) commit 0d10a73a546e2813582e377ee44cd9dba663bef2 Author: Douglas Mencken <dougmenc...@gmail.com> Date: Fri Oct 16 16:12:46 2015 -0400 temporarily(?) disable ww8export & ww8import qa-tests for Mac OS X 10.5 Change-Id: If4ac2239c3f6ed9d992072a537e3728e1fdbee4e diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk index 7dfd541..03fa9a9 100644 --- a/sw/Module_sw.mk +++ b/sw/Module_sw.mk @@ -62,8 +62,8 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\ CppunitTest_sw_ooxmlfieldexport \ CppunitTest_sw_ooxmlw14export \ CppunitTest_sw_ooxmlimport \ - CppunitTest_sw_ww8export \ - CppunitTest_sw_ww8import \ + $(if $(filter-out 1050,$(MACOSX_SDK_VERSION)),CppunitTest_sw_ww8export) \ + $(if $(filter-out 1050,$(MACOSX_SDK_VERSION)),CppunitTest_sw_ww8import) \ CppunitTest_sw_rtfexport \ CppunitTest_sw_rtfimport \ CppunitTest_sw_odfexport \ commit 1f5a7db72a022e448e3608a048bb10fc8e88a491 Author: Douglas Mencken <dougmenc...@gmail.com> Date: Thu Oct 15 11:00:00 2015 -0400 [UNO~C++] [WiP] try to fix UNO bridge for gcc3_macosx_powerpc part diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx index 81bae49f..556e87c 100644 --- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx @@ -49,7 +49,7 @@ static typelib_TypeClass cpp2uno_call( // gpreg: [ret *], this, [gpr params] // fpreg: [fpr params] - // ovrflw: [gpr or fpr params (properly aligned)] + // ovrflw: [gpr or fpr params (space for entire parameter list aligned)] // return typelib_TypeDescription * pReturnTypeDescr = 0; @@ -83,11 +83,14 @@ static typelib_TypeClass cpp2uno_call( // stack space assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" ); + // parameters void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams ); void ** pCppArgs = pUnoArgs + nParams; + // indices of values this have to be converted (interface conversion cpp<=>uno) sal_Int32 * pTempIndices = (sal_Int32 *)(pUnoArgs + (2 * nParams)); + // type descriptions for reconversions typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams)); @@ -102,7 +105,6 @@ static typelib_TypeClass cpp2uno_call( if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) // value { - switch (pParamTypeDescr->eTypeClass) { @@ -524,8 +526,8 @@ static void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** gpreg int const codeSnippetSize = 136; -unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset, - bool simpleRetType) +unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, + sal_Int32 vtableOffset, bool simpleRetType ) { // fprintf(stderr,"in codeSnippet functionIndex is %x\n", functionIndex); @@ -679,8 +681,9 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset, sal_Int32 functionCount, sal_Int32 vtableOffset) { - (*slots) -= functionCount; - Slot * s = *slots; + (*slots) -= functionCount; + Slot * s = *slots; + // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset); // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset); // fflush(stderr); diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous index 7fb88fe..b2d22f0 100644 --- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous @@ -46,7 +46,7 @@ static typelib_TypeClass cpp2uno_call( // gpreg: [ret *], this, [gpr params] // fpreg: [fpr params] - // ovrflw: [gpr or fpr params (space for entire parameter list in structure format properly aligned)] + // ovrflw: [gpr or fpr params (space for entire parameter list aligned)] // return typelib_TypeDescription * pReturnTypeDescr = 0; @@ -59,11 +59,13 @@ static typelib_TypeClass cpp2uno_call( sal_Int32 ngpreg = 0; sal_Int32 nfpreg = 0; - + // handle optional return pointer if (pReturnTypeDescr) { if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) + { pUnoReturn = pRegisterReturn; // direct way for simple types + } else // complex return via ptr (pCppReturn) { pCppReturn = *gpreg; @@ -141,19 +143,19 @@ static typelib_TypeClass cpp2uno_call( pCppStack = (char *)ovrflw; // stack space - OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" ); + assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" ); // parameters void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams ); void ** pCppArgs = pUnoArgs + nParams; - // indizes of values this have to be converted (interface conversion cpp<=>uno) - sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams)); + // indices of values this have to be converted (interface conversion cpp<=>uno) + sal_Int32 * pTempIndices = (sal_Int32 *)(pUnoArgs + (2 * nParams)); // type descriptions for reconversions typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams)); - sal_Int32 nTempIndizes = 0; + sal_Int32 nTempIndices = 0; for ( nPos = 0; nPos < nParams; ++nPos ) { @@ -199,9 +201,9 @@ static typelib_TypeClass cpp2uno_call( { // uno out is unconstructed mem! pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ); - pTempIndizes[nTempIndizes] = nPos; + pTempIndices[nTempIndices] = nPos; // will be released at reconversion - ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; } // is in/inout else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr )) @@ -209,9 +211,9 @@ static typelib_TypeClass cpp2uno_call( uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ), *(void **)pCppStack, pParamTypeDescr, pThis->getBridge()->getCpp2Uno() ); - pTempIndizes[nTempIndizes] = nPos; // has to be reconverted + pTempIndices[nTempIndices] = nPos; // has to be reconverted // will be released at reconversion - ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; } else // direct way { @@ -223,26 +225,24 @@ static typelib_TypeClass cpp2uno_call( pCppStack += sizeof(sal_Int32); // standard parameter length } - // ExceptionHolder uno_Any aUnoExc; // Any will be constructed by callee uno_Any * pUnoExc = &aUnoExc; // invoke uno dispatch call - (*pThis->getUnoI()->pDispatcher)( - pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); + (*pThis->getUnoI()->pDispatcher)( pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); // in case an exception occurred... if (pUnoExc) { // destruct temporary in/inout params - for ( ; nTempIndizes--; ) + for ( ; nTempIndices--; ) { - sal_Int32 nIndex = pTempIndizes[nTempIndizes]; + sal_Int32 nIndex = pTempIndices[nTempIndices]; if (pParams[nIndex].bIn) // is in/inout => was constructed - uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 ); - TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] ); + uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndices], 0 ); + TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] ); } if (pReturnTypeDescr) TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); @@ -256,10 +256,10 @@ static typelib_TypeClass cpp2uno_call( else // else no exception occurred... { // temporary params - for ( ; nTempIndizes--; ) + for ( ; nTempIndices--; ) { - sal_Int32 nIndex = pTempIndizes[nTempIndizes]; - typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes]; + sal_Int32 nIndex = pTempIndices[nTempIndices]; + typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices]; if (pParams[nIndex].bOut) // inout/out { @@ -305,7 +305,7 @@ static typelib_TypeClass cpp_mediate( void ** gpreg, void ** fpreg, void ** ovrflw, sal_Int64 * pRegisterReturn /* space for register return */ ) { - OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" ); + assert( sizeof(sal_Int32)==sizeof(void *) && "### unexpected!" ); // gpreg: [ret *], this, [other gpr params] // fpreg: [fpr params] @@ -329,7 +329,7 @@ static typelib_TypeClass cpp_mediate( typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr(); - OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); + assert( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex && "### illegal vtable index!" ); if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex) { throw RuntimeException( @@ -339,7 +339,7 @@ static typelib_TypeClass cpp_mediate( // determine called method sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex]; - OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" ); + assert( nMemberPos < pTypeDescr->nAllMembers && "### illegal member index!" ); TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] ); @@ -516,7 +516,7 @@ unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, if (! simpleRetType ) functionIndex |= 0x80000000; - // OSL_ASSERT( sizeof (long) == 4 ); + // assert( sizeof (long) == 4 ); // FIXME: why are we leaving an 8k gap in the stack here // FIXME: is this to allow room for signal handling frames? @@ -652,7 +652,8 @@ sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize( bridges::cpp_uno::shared::VtableFactory::Slot * bridges::cpp_uno::shared::VtableFactory::initializeBlock( - void * block, sal_Int32 slotCount) + void * block, sal_Int32 slotCount, sal_Int32, + typelib_InterfaceTypeDescription *) { Slot * slots = mapBlockToVtable(block); slots[-2].fn = 0; @@ -675,7 +676,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( for (sal_Int32 i = 0; i < type->nMembers; ++i) { typelib_TypeDescription * member = 0; TYPELIB_DANGER_GET(&member, type->ppMembers[i]); - OSL_ASSERT(member != 0); + assert(member != 0); switch (member->eTypeClass) { case typelib_TypeClass_INTERFACE_ATTRIBUTE: // Getter: @@ -708,7 +709,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( break; default: - OSL_ASSERT(false); + assert(false); break; } TYPELIB_DANGER_RELEASE(member); diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx index 9c09999..b0a4e3f 100644 --- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx @@ -303,7 +303,7 @@ static void callVirtualMethod( static void cpp_call( bridges::cpp_uno::shared::UnoInterfaceProxy * pThis, - bridges::cpp_uno::shared::VtableSlot aVtableSlot, + bridges::cpp_uno::shared::VtableSlot aVtableSlot, typelib_TypeDescriptionReference * pReturnTypeRef, sal_Int32 nParams, typelib_MethodParameter * pParams, void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc ) @@ -320,7 +320,7 @@ static void cpp_call( // return typelib_TypeDescription * pReturnTypeDescr = 0; TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); - // assert( pReturnTypeDescr && "### expected return type description!" ); + //assert( pReturnTypeDescr && "### expected return type description!" ); void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion @@ -341,13 +341,13 @@ static void cpp_call( } } // push this - void* pAdjustedThisPtr = reinterpret_cast< void **>(pThis->getCppI()) + aVtableSlot.offset; + void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset; *(void**)pCppStack = pAdjustedThisPtr; pCppStack += sizeof( void* ); *pPT++ = 'I'; // stack space - // assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" ); + //assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" ); // args void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams ); // indices of values this have to be converted (interface conversion cpp<=>uno) @@ -430,8 +430,7 @@ static void cpp_call( { uno_copyAndConvertData( *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), - pUnoArgs[nPos], pParamTypeDescr, - pThis->getBridge()->getUno2Cpp() ); + pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() ); pTempIndices[nTempIndices] = nPos; // has to be reconverted // will be released at reconversion @@ -499,8 +498,7 @@ static void cpp_call( catch (...) { // fill uno exception - fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, - *ppUnoExc, pThis->getBridge()->getCpp2Uno() ); + fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() ); // temporary params for ( ; nTempIndices--; ) @@ -525,8 +523,8 @@ void unoInterfaceProxyDispatch( void * pReturn, void * pArgs[], uno_Any ** ppException ) { // is my surrogate - bridges::cpp_uno::shared::UnoInterfaceProxy * pThis - = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI); + bridges::cpp_uno::shared::UnoInterfaceProxy * pThis + = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI); switch (pMemberDescr->eTypeClass) { diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous index 0f5e0bc..67435c0 100644 --- a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous @@ -38,7 +38,7 @@ using namespace ::com::sun::star::uno; namespace { -//================================================================================================== + static void callVirtualMethod( void * pAdjustedThisPtr, sal_Int32 nVtableIndex, @@ -77,9 +77,6 @@ static void callVirtualMethod( // Note: This keeps us from having to decode the signature twice and // prevents problems with later local variables. - // FIXME: I do not believe the following is true but we will keep the - // FIXME: extra space just to be safe until proven otherwise - // Note: could require up to 2*nStackLongs words of parameter stack area // if the call has many float parameters (i.e. floats take up only 1 // word on the stack but take 2 words in parameter area in the @@ -267,16 +264,16 @@ static void callVirtualMethod( case typelib_TypeClass_CHAR: case typelib_TypeClass_SHORT: case typelib_TypeClass_UNSIGNED_SHORT: - *(unsigned short*)pRegisterReturn = (unsigned short)iret; + *(unsigned short*)pRegisterReturn = (unsigned short)iret; break; case typelib_TypeClass_BOOLEAN: case typelib_TypeClass_BYTE: - *(unsigned char*)pRegisterReturn = (unsigned char)iret; + *(unsigned char*)pRegisterReturn = (unsigned char)iret; break; case typelib_TypeClass_FLOAT: - *(float*)pRegisterReturn = (float)dret; + *(float*)pRegisterReturn = (float)dret; break; case typelib_TypeClass_DOUBLE: @@ -288,7 +285,6 @@ static void callVirtualMethod( } -//================================================================================================== static void cpp_call( bridges::cpp_uno::shared::UnoInterfaceProxy * pThis, bridges::cpp_uno::shared::VtableSlot aVtableSlot, @@ -308,7 +304,7 @@ static void cpp_call( // return typelib_TypeDescription * pReturnTypeDescr = 0; TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); - OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" ); + //assert( pReturnTypeDescr && "### expected return type description!" ); void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion @@ -330,22 +326,21 @@ static void cpp_call( } } // push this - void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) - + aVtableSlot.offset; + void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + aVtableSlot.offset; *(void**)pCppStack = pAdjustedThisPtr; pCppStack += sizeof( void* ); *pPT++ = 'I'; // stack space - OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" ); + //assert( sizeof(void *) == sizeof(sal_Int32) && "### unexpected size!" ); // args void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams ); - // indizes of values this have to be converted (interface conversion cpp<=>uno) - sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams); + // indices of values this have to be converted (interface conversion cpp<=>uno) + sal_Int32 * pTempIndices = (sal_Int32 *)(pCppArgs + nParams); // type descriptions for reconversions typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams)); - sal_Int32 nTempIndizes = 0; + sal_Int32 nTempIndices = 0; for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos ) { @@ -353,8 +348,7 @@ static void cpp_call( typelib_TypeDescription * pParamTypeDescr = 0; TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); - if (!rParam.bOut - && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) + if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) { uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() ); @@ -412,9 +406,9 @@ static void cpp_call( uno_constructData( *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), pParamTypeDescr ); - pTempIndizes[nTempIndizes] = nPos; // default constructed for cpp call + pTempIndices[nTempIndices] = nPos; // default constructed for cpp call // will be released at reconversion - ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; } // is in/inout else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr )) @@ -423,9 +417,9 @@ static void cpp_call( *(void **)pCppStack = pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() ); - pTempIndizes[nTempIndizes] = nPos; // has to be reconverted + pTempIndices[nTempIndices] = nPos; // has to be reconverted // will be released at reconversion - ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; } else // direct way { @@ -444,7 +438,7 @@ static void cpp_call( try { - OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 3), "UNALIGNED STACK !!! (Please DO panic)" ); + assert( !( (pCppStack - pCppStackStart ) & 3) && "UNALIGNED STACK !!! (Please DO panic)" ); callVirtualMethod( pAdjustedThisPtr, aVtableSlot.index, pCppReturn, pReturnTypeDescr->eTypeClass, pParamType, @@ -453,10 +447,10 @@ static void cpp_call( *ppUnoExc = 0; // reconvert temporary params - for ( ; nTempIndizes--; ) + for ( ; nTempIndices--; ) { - sal_Int32 nIndex = pTempIndizes[nTempIndizes]; - typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes]; + sal_Int32 nIndex = pTempIndices[nTempIndices]; + typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices]; if (pParams[nIndex].bIn) { @@ -491,12 +485,12 @@ static void cpp_call( fillUnoException( CPPU_CURRENT_NAMESPACE::__cxa_get_globals()->caughtExceptions, *ppUnoExc, pThis->getBridge()->getCpp2Uno() ); // temporary params - for ( ; nTempIndizes--; ) + for ( ; nTempIndices--; ) { - sal_Int32 nIndex = pTempIndizes[nTempIndizes]; + sal_Int32 nIndex = pTempIndices[nTempIndices]; // destroy temp cpp param => cpp: every param was constructed - uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], cpp_release ); - TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] ); + uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndices], cpp_release ); + TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] ); } // return type if (pReturnTypeDescr) @@ -514,8 +508,7 @@ void unoInterfaceProxyDispatch( { // is my surrogate bridges::cpp_uno::shared::UnoInterfaceProxy * pThis - = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI); - // typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr; + = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy * > (pUnoI); switch (pMemberDescr->eTypeClass) { commit fed23c77ddac5f027d846dc2f5f47fda7398ae9c Author: Douglas Mencken <dougmenc...@gmail.com> Date: Thu Oct 15 10:46:53 2015 -0400 [UNO~C++] restore vintage versions of cpp2uno.cxx and uno2cpp.cxx ... from famous commit 7aa6f1b01481c1d0f1a12f56ad197c797056c37b diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous new file mode 100644 index 0000000..7fb88fe --- /dev/null +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx.previous @@ -0,0 +1,719 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 . + */ + + +#include <com/sun/star/uno/genfunc.hxx> +#include <uno/data.h> +#include <typelib/typedescription.hxx> + +#include "bridges/cpp_uno/shared/bridge.hxx" +#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx" +#include "bridges/cpp_uno/shared/types.hxx" +#include "bridges/cpp_uno/shared/vtablefactory.hxx" + +#include "share.hxx" + +using namespace ::com::sun::star::uno; + +namespace +{ + +//================================================================================================== +static typelib_TypeClass cpp2uno_call( + bridges::cpp_uno::shared::CppInterfaceProxy * pThis, + const typelib_TypeDescription * pMemberTypeDescr, + typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return + sal_Int32 nParams, typelib_MethodParameter * pParams, + void ** gpreg, void ** fpreg, void ** ovrflw, + sal_Int64 * pRegisterReturn /* space for register return */ ) +{ + + // gpreg: [ret *], this, [gpr params] + // fpreg: [fpr params] + // ovrflw: [gpr or fpr params (space for entire parameter list in structure format properly aligned)] + + // return + typelib_TypeDescription * pReturnTypeDescr = 0; + if (pReturnTypeRef) + TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); + + void * pUnoReturn = 0; + void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need + + sal_Int32 ngpreg = 0; + sal_Int32 nfpreg = 0; + + + if (pReturnTypeDescr) + { + if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) + pUnoReturn = pRegisterReturn; // direct way for simple types + else // complex return via ptr (pCppReturn) + { + pCppReturn = *gpreg; + ngpreg++; + ++ovrflw; + + pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr ) + ? alloca( pReturnTypeDescr->nSize ) + : pCppReturn); // direct way + } + } + // pop this + ngpreg++; + ++ovrflw; + + // after handling optional return pointer and "this" + // make use of the space that is allocated to store all parameters in the callers stack + // by comying the proper registers filled with parameters to that space + char * pCppStack = (char *)ovrflw; + + + sal_Int32 nPos; + + for ( nPos = 0; nPos < nParams; ++nPos ) + { + const typelib_MethodParameter & rParam = pParams[nPos]; + if (rParam.bOut) + { + if (ngpreg < 8) + { + *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++]; + } + pCppStack += sizeof (sal_Int32); + } + else + { + switch (rParam.pTypeRef->eTypeClass) + { + case typelib_TypeClass_FLOAT: + if (nfpreg < 13) + { + *(float *)pCppStack = ((double *)fpreg)[nfpreg++]; + } + pCppStack += sizeof (float); + ngpreg += 1; + break; + case typelib_TypeClass_DOUBLE: + if (nfpreg < 13) + { + *(double *)pCppStack = ((double *)fpreg)[nfpreg++]; + } + pCppStack += sizeof (double); + ngpreg += 2; + break; + case typelib_TypeClass_UNSIGNED_HYPER: + case typelib_TypeClass_HYPER: + if (ngpreg < 8) + { + *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++]; + } + pCppStack += sizeof (sal_Int32); + // fall through on purpose + default: + if (ngpreg < 8) + { + *(sal_Int32 *)pCppStack = ((sal_Int32 *)gpreg)[ngpreg++]; + } + pCppStack += sizeof (sal_Int32); + } + } + } + + // now the stack has all of the parameters stored in it ready to be processed + // so we are ready to build the uno call stack + pCppStack = (char *)ovrflw; + + // stack space + OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" ); + + // parameters + void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams ); + void ** pCppArgs = pUnoArgs + nParams; + + // indizes of values this have to be converted (interface conversion cpp<=>uno) + sal_Int32 * pTempIndizes = (sal_Int32 *)(pUnoArgs + (2 * nParams)); + + // type descriptions for reconversions + typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams)); + + sal_Int32 nTempIndizes = 0; + + for ( nPos = 0; nPos < nParams; ++nPos ) + { + const typelib_MethodParameter & rParam = pParams[nPos]; + typelib_TypeDescription * pParamTypeDescr = 0; + TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); + + if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) + // value + { + switch (pParamTypeDescr->eTypeClass) + { + case typelib_TypeClass_BOOLEAN: + case typelib_TypeClass_BYTE: + pCppArgs[nPos] = pCppStack +3; + pUnoArgs[nPos] = pCppStack +3; + break; + case typelib_TypeClass_CHAR: + case typelib_TypeClass_SHORT: + case typelib_TypeClass_UNSIGNED_SHORT: + pCppArgs[nPos] = pCppStack +2; + pUnoArgs[nPos] = pCppStack +2; + break; + case typelib_TypeClass_HYPER: + case typelib_TypeClass_UNSIGNED_HYPER: + case typelib_TypeClass_DOUBLE: + pCppArgs[nPos] = pCppStack; + pUnoArgs[nPos] = pCppStack; + pCppStack += sizeof(sal_Int32); // extra long (two regs) + break; + default: + pCppArgs[nPos] = pCppStack; + pUnoArgs[nPos] = pCppStack; + } + // no longer needed + TYPELIB_DANGER_RELEASE( pParamTypeDescr ); + } + else // ptr to complex value | ref + { + pCppArgs[nPos] = *(void **)pCppStack; + + if (! rParam.bIn) // is pure out + { + // uno out is unconstructed mem! + pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ); + pTempIndizes[nTempIndizes] = nPos; + // will be released at reconversion + ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + } + // is in/inout + else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr )) + { + uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ), + *(void **)pCppStack, pParamTypeDescr, + pThis->getBridge()->getCpp2Uno() ); + pTempIndizes[nTempIndizes] = nPos; // has to be reconverted + // will be released at reconversion + ppTempParamTypeDescr[nTempIndizes++] = pParamTypeDescr; + } + else // direct way + { + pUnoArgs[nPos] = *(void **)pCppStack; + // no longer needed + TYPELIB_DANGER_RELEASE( pParamTypeDescr ); + } + } + pCppStack += sizeof(sal_Int32); // standard parameter length + } + + + // ExceptionHolder + uno_Any aUnoExc; // Any will be constructed by callee + uno_Any * pUnoExc = &aUnoExc; + + // invoke uno dispatch call + (*pThis->getUnoI()->pDispatcher)( + pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); + + // in case an exception occurred... + if (pUnoExc) + { + // destruct temporary in/inout params + for ( ; nTempIndizes--; ) + { + sal_Int32 nIndex = pTempIndizes[nTempIndizes]; + + if (pParams[nIndex].bIn) // is in/inout => was constructed + uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndizes], 0 ); + TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndizes] ); + } + if (pReturnTypeDescr) + TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); + + CPPU_CURRENT_NAMESPACE::raiseException( + &aUnoExc, pThis->getBridge()->getUno2Cpp() ); + // has to destruct the any + // is here for dummy + return typelib_TypeClass_VOID; + } + else // else no exception occurred... + { + // temporary params + for ( ; nTempIndizes--; ) + { + sal_Int32 nIndex = pTempIndizes[nTempIndizes]; + typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndizes]; + + if (pParams[nIndex].bOut) // inout/out + { + // convert and assign + uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release ); + uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr, + pThis->getBridge()->getUno2Cpp() ); + } + // destroy temp uno param + uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); + + TYPELIB_DANGER_RELEASE( pParamTypeDescr ); + } + // return + if (pCppReturn) // has complex return + { + if (pUnoReturn != pCppReturn) // needs reconversion + { + uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr, + pThis->getBridge()->getUno2Cpp() ); + // destroy temp uno return + uno_destructData( pUnoReturn, pReturnTypeDescr, 0 ); + } + // complex return ptr is set to return reg + *(void **)pRegisterReturn = pCppReturn; + } + if (pReturnTypeDescr) + { + typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass; + TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); + return eRet; + } + else + return typelib_TypeClass_VOID; + } +} + + +//================================================================================================== +static typelib_TypeClass cpp_mediate( + sal_Int32 nFunctionIndex, + sal_Int32 nVtableOffset, + void ** gpreg, void ** fpreg, void ** ovrflw, + sal_Int64 * pRegisterReturn /* space for register return */ ) +{ + OSL_ENSURE( sizeof(sal_Int32)==sizeof(void *), "### unexpected!" ); + + // gpreg: [ret *], this, [other gpr params] + // fpreg: [fpr params] + // ovrflw: [gpr or fpr params (in space allocated for all params properly aligned)] + + void * pThis; + if( nFunctionIndex & 0x80000000 ) + { + nFunctionIndex &= 0x7fffffff; + pThis = gpreg[1]; + } + else + { + pThis = gpreg[0]; + } + + pThis = static_cast< char * >(pThis) - nVtableOffset; + bridges::cpp_uno::shared::CppInterfaceProxy * pCppI + = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(pThis); + + + typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr(); + + OSL_ENSURE( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex, "### illegal vtable index!" ); + if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex) + { + throw RuntimeException( + rtl::OUString( "illegal vtable index!" ), + (XInterface *)pThis ); + } + + // determine called method + sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex]; + OSL_ENSURE( nMemberPos < pTypeDescr->nAllMembers, "### illegal member index!" ); + + TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] ); + + typelib_TypeClass eRet; + switch (aMemberDescr.get()->eTypeClass) + { + case typelib_TypeClass_INTERFACE_ATTRIBUTE: + { + if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex) + { + // is GET method + eRet = cpp2uno_call( + pCppI, aMemberDescr.get(), + ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef, + 0, 0, // no params + gpreg, fpreg, ovrflw, pRegisterReturn ); + } + else + { + // is SET method + typelib_MethodParameter aParam; + aParam.pTypeRef = + ((typelib_InterfaceAttributeTypeDescription *)aMemberDescr.get())->pAttributeTypeRef; + aParam.bIn = sal_True; + aParam.bOut = sal_False; + + eRet = cpp2uno_call( + pCppI, aMemberDescr.get(), + 0, // indicates void return + 1, &aParam, + gpreg, fpreg, ovrflw, pRegisterReturn ); + } + break; + } + case typelib_TypeClass_INTERFACE_METHOD: + { + // is METHOD + switch (nFunctionIndex) + { + case 1: // acquire() + pCppI->acquireProxy(); // non virtual call! + eRet = typelib_TypeClass_VOID; + break; + case 2: // release() + pCppI->releaseProxy(); // non virtual call! + eRet = typelib_TypeClass_VOID; + break; + case 0: // queryInterface() opt + { + typelib_TypeDescription * pTD = 0; + TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() ); + if (pTD) + { + XInterface * pInterface = 0; + (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)( + pCppI->getBridge()->getCppEnv(), + (void **)&pInterface, pCppI->getOid().pData, (typelib_InterfaceTypeDescription *)pTD ); + + if (pInterface) + { + ::uno_any_construct( + reinterpret_cast< uno_Any * >( gpreg[0] ), + &pInterface, pTD, cpp_acquire ); + pInterface->release(); + TYPELIB_DANGER_RELEASE( pTD ); + *(void **)pRegisterReturn = gpreg[0]; + eRet = typelib_TypeClass_ANY; + break; + } + TYPELIB_DANGER_RELEASE( pTD ); + } + } // else perform queryInterface() + default: + eRet = cpp2uno_call( + pCppI, aMemberDescr.get(), + ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pReturnTypeRef, + ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->nParams, + ((typelib_InterfaceMethodTypeDescription *)aMemberDescr.get())->pParams, + gpreg, fpreg, ovrflw, pRegisterReturn ); + } + break; + } + default: + { + throw RuntimeException( + rtl::OUString( "no member description found!" ), + (XInterface *)pThis ); + } + } + + return eRet; +} + +//================================================================================================== +/** + * is called on incoming vtable calls + * (called by asm snippets) + */ +static void cpp_vtable_call( int nFunctionIndex, int nVtableOffset, void** gpregptr, void** fpregptr, void** ovrflw) +{ + sal_Int32 gpreg[8]; + double fpreg[13]; + + // FIXME: why are we restoring the volatile ctr register here + sal_Int32 ctrsave = ((sal_Int32*)gpregptr)[-1]; + + memcpy( gpreg, gpregptr, 32); + memcpy( fpreg, fpregptr, 104); + + volatile long nRegReturn[2]; + + // sal_Bool bComplex = nFunctionIndex & 0x80000000 ? sal_True : sal_False; + + typelib_TypeClass aType = + cpp_mediate( nFunctionIndex, nVtableOffset, (void**)gpreg, (void**)fpreg, ovrflw, (sal_Int64*)nRegReturn ); + + // FIXME: why are we restoring the volatile ctr register here + // FIXME: and why are we putting back the values for r4, r5, and r6 as well + // FIXME: this makes no sense to me, all of these registers are volatile! + __asm__( "lwz r4, %0\n\t" + "mtctr r4\n\t" + "lwz r4, %1\n\t" + "lwz r5, %2\n\t" + "lwz r6, %3\n\t" + : : "m"(ctrsave), "m"(gpreg[1]), "m"(gpreg[2]), "m"(gpreg[3]) ); + + switch( aType ) + { + + // move return value into register space + // (will be loaded by machine code snippet) + + case typelib_TypeClass_BOOLEAN: + case typelib_TypeClass_BYTE: + __asm__( "lbz r3,%0\n\t" : : + "m"(nRegReturn[0]) ); + break; + + case typelib_TypeClass_CHAR: + case typelib_TypeClass_SHORT: + case typelib_TypeClass_UNSIGNED_SHORT: + __asm__( "lhz r3,%0\n\t" : : + "m"(nRegReturn[0]) ); + break; + + case typelib_TypeClass_FLOAT: + __asm__( "lfs f1,%0\n\t" : : + "m" (*((float*)nRegReturn)) ); + break; + + case typelib_TypeClass_DOUBLE: + __asm__( "lfd f1,%0\n\t" : : + "m" (*((double*)nRegReturn)) ); + break; + + case typelib_TypeClass_HYPER: + case typelib_TypeClass_UNSIGNED_HYPER: + __asm__( "lwz r4,%0\n\t" : : + "m"(nRegReturn[1]) ); // fall through + + default: + __asm__( "lwz r3,%0\n\t" : : + "m"(nRegReturn[0]) ); + break; + } +} + + +int const codeSnippetSize = 136; + +unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, + sal_Int32 vtableOffset, bool simpleRetType ) +{ + if (! simpleRetType ) + functionIndex |= 0x80000000; + + // OSL_ASSERT( sizeof (long) == 4 ); + + // FIXME: why are we leaving an 8k gap in the stack here + // FIXME: is this to allow room for signal handling frames? + // FIXME: seems like overkill here but this is what was done for Mac OSX for gcc2 + // FIXME: also why no saving of the non-volatile CR pieces here, to be safe + // FIXME: we probably should + + /* generate this code */ + + // # so first save gpr 3 to gpr 10 (aligned to 4) + // stw r3, -8000(r1) + // stw r4, -7996(r1) + // stw r5, -7992(r1) + // stw r6, -7988(r1) + // stw r7, -7984(r1) + // stw r8, -7980(r1) + // stw r9, -7976(r1) + // stw r10,-7972(r1) + + // # next save fpr 1 to fpr 13 (aligned to 8) + // stfd f1, -7968(r1) + // stfd f2, -7960(r1) + // stfd f3, -7952(r1) + // stfd f4, -7944(r1) + // stfd f5, -7936(r1) + // stfd f6, -7928(r1) + // stfd f7, -7920(r1) + // stfd f8, -7912(r1) + // stfd f9, -7904(r1) + // stfd f10,-7896(r1) + // stfd f11,-7888(r1) + // stfd f12,-7880(r1) + // stfd f13,-7872(r1) + + // FIXME: ctr is volatile, while are we saving it and not CR? + // mfctr r3 + // stw r3, -8004(r1) + + // # now here is where cpp_vtable_call must go + // lis r3,0xdead + // ori r3,r3,0xbeef + // mtctr r3 + + // # now load up the functionIndex number + // lis r3, 0xdead + // ori r3,r3,0xbeef + + // # now load up the vtableOffset + // lis r4, 0xdead + // ori r4,r4,0xbeef + + // #now load up the pointer to the saved gpr registers + // addi r5,r1,-8000 + + // #now load up the pointer to the saved fpr registers + // addi r6,r1,-7968 + + // #now load up the pointer to the overflow call stack + // addi r7,r1,24 # frame pointer plus 24 + + // bctr + + unsigned long * p = (unsigned long *) code; + + * p++ = 0x9061e0c0; + * p++ = 0x9081e0c4; + * p++ = 0x90a1e0c8; + * p++ = 0x90c1e0cc; + * p++ = 0x90e1e0d0; + * p++ = 0x9101e0d4; + * p++ = 0x9121e0d8; + * p++ = 0x9141e0dc; + * p++ = 0xd821e0e0; + * p++ = 0xd841e0e8; + * p++ = 0xd861e0f0; + * p++ = 0xd881e0f8; + * p++ = 0xd8a1e100; + * p++ = 0xd8c1e108; + * p++ = 0xd8e1e110; + * p++ = 0xd901e118; + * p++ = 0xd921e120; + * p++ = 0xd941e128; + * p++ = 0xd961e130; + * p++ = 0xd981e138; + * p++ = 0xd9a1e140; + * p++ = 0x7c6902a6; + * p++ = 0x9061e0bc; + * p++ = 0x3c600000 | (((unsigned long)cpp_vtable_call) >> 16); + * p++ = 0x60630000 | (((unsigned long)cpp_vtable_call) & 0x0000FFFF); + * p++ = 0x7c6903a6; + * p++ = 0x3c600000 | (((unsigned long)functionIndex) >> 16); + * p++ = 0x60630000 | (((unsigned long)functionIndex) & 0x0000FFFF); + * p++ = 0x3c800000 | (((unsigned long)vtableOffset) >> 16); + * p++ = 0x60840000 | (((unsigned long)vtableOffset) & 0x0000FFFF); + * p++ = 0x38a1e0c0; + * p++ = 0x38c1e0e0; + * p++ = 0x38e10018; + * p++ = 0x4e800420; + + return (code + codeSnippetSize); + +} + + +} + +void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const * bptr, unsigned char const * eptr) +{ + int const lineSize = 32; + for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) { + __asm__ volatile ("dcbst 0, %0" : : "r"(p) : "memory"); + } + __asm__ volatile ("sync" : : : "memory"); + for (unsigned char const * p = bptr; p < eptr + lineSize; p += lineSize) { + __asm__ volatile ("icbi 0, %0" : : "r"(p) : "memory"); + } + __asm__ volatile ("isync" : : : "memory"); +} + +struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; }; + +bridges::cpp_uno::shared::VtableFactory::Slot * +bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) +{ + return static_cast< Slot * >(block) + 2; +} + +sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize( + sal_Int32 slotCount) +{ + return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize; +} + +bridges::cpp_uno::shared::VtableFactory::Slot * +bridges::cpp_uno::shared::VtableFactory::initializeBlock( + void * block, sal_Int32 slotCount) +{ + Slot * slots = mapBlockToVtable(block); + slots[-2].fn = 0; + slots[-1].fn = 0; + return slots + slotCount; +} + +unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( + Slot ** slots, unsigned char * code, + typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset, + sal_Int32 functionCount, sal_Int32 vtableOffset) +{ + (*slots) -= functionCount; + Slot * s = *slots; + + // fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset); + // fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset); + // fflush(stderr); + + for (sal_Int32 i = 0; i < type->nMembers; ++i) { + typelib_TypeDescription * member = 0; + TYPELIB_DANGER_GET(&member, type->ppMembers[i]); + OSL_ASSERT(member != 0); + switch (member->eTypeClass) { + case typelib_TypeClass_INTERFACE_ATTRIBUTE: + // Getter: + (s++)->fn = code; + code = codeSnippet( + code, functionOffset++, vtableOffset, + bridges::cpp_uno::shared::isSimpleType( + reinterpret_cast< + typelib_InterfaceAttributeTypeDescription * >( + member)->pAttributeTypeRef)); + + // Setter: + if (!reinterpret_cast< + typelib_InterfaceAttributeTypeDescription * >( + member)->bReadOnly) + { + (s++)->fn = code; + code = codeSnippet(code, functionOffset++, vtableOffset, true); + } + break; + + case typelib_TypeClass_INTERFACE_METHOD: + (s++)->fn = code; + code = codeSnippet( + code, functionOffset++, vtableOffset, + bridges::cpp_uno::shared::isSimpleType( + reinterpret_cast< + typelib_InterfaceMethodTypeDescription * >( + member)->pReturnTypeRef)); + break; + + default: + OSL_ASSERT(false); + break; + } + TYPELIB_DANGER_RELEASE(member); + } + return code; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous new file mode 100644 index 0000000..0f5e0bc --- /dev/null +++ b/bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx.previous @@ -0,0 +1,636 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 . + */ + + +#include <sys/types.h> +#include <sys/malloc.h> + +#include <com/sun/star/uno/genfunc.hxx> +#include <uno/data.h> + +#include "bridges/cpp_uno/shared/bridge.hxx" +#include "bridges/cpp_uno/shared/types.hxx" +#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx" +#include "bridges/cpp_uno/shared/vtables.hxx" + +#include "share.hxx" + + +using namespace ::rtl; +using namespace ::com::sun::star::uno; + +namespace +{ + +//================================================================================================== +static void callVirtualMethod( + void * pAdjustedThisPtr, + sal_Int32 nVtableIndex, + void * pRegisterReturn, + typelib_TypeClass eReturnType, + char * pPT, + sal_Int32 * pStackLongs, + sal_Int32 /* nStackLongs */) +{ + + // parameter list is mixed list of * and values + // reference parameters are pointers + + // the basic idea here is to use gpr[8] as a storage area for + // the future values of registers r3 to r10 needed for the call, + // and similarly fpr[13] as a storage area for the future values + // of floating point registers f1 to f13 + + unsigned long * mfunc; // actual function to be invoked + int gpr[8]; // storage for gpregisters, map to r3-r10 + int off; // offset used to find function + double fpr[13]; // storage for fpregisters, map to f1-f13 + int n; // number of gprs mapped so far + int f; // number of fprs mapped so far + volatile long *p; // pointer to parameter overflow area + int c; // character of parameter type being decoded + volatile double dret; // temporary function return values + volatile int iret, iret2; + + // Because of the Power PC calling conventions we could be passing + // parameters in both register types and on the stack. To create the + // stack parameter area we need we now simply allocate local + // variable storage param[] that is at least the size of the parameter stack + // (more than enough space) which we can overwrite the parameters into. + + // Note: This keeps us from having to decode the signature twice and + // prevents problems with later local variables. + + // FIXME: I do not believe the following is true but we will keep the + // FIXME: extra space just to be safe until proven otherwise + + // Note: could require up to 2*nStackLongs words of parameter stack area + // if the call has many float parameters (i.e. floats take up only 1 + // word on the stack but take 2 words in parameter area in the + // stack frame . + + + // unsigned long param[(2*nStackLongs)]; + + /* now begin to load the C++ function arguments into storage */ + n = 0; + f = 0; + + + /* set up a pointer to the stack parameter area */ + __asm__ ( "addi %0,r1,24" : "=r" (p) : /* no inputs */ ); + + // #i94421#, work around compiler error: + volatile long * pCopy = p; + (void) pCopy; // avoid warning about unused variable + + // never called + // if (! pAdjustedThisPtr )CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something + + + // now we need to parse the entire signature string + // until we get the END indicator + + // treat complex return pointer like any other parameter + + // parse the argument list up to the ending ) + + while (*pPT != 'X') { + c = *pPT; + switch (c) { + + case 'D': /* type is double */ + if (f < 13) { + fpr[f++] = *((double *)pStackLongs); /* store in register */ + n+=2; + p+=2; + } else { + *p++ = *pStackLongs; /* or on the parameter stack */ + *p++ = *(pStackLongs + 1); + } + pStackLongs += 2; + break; + + case 'F': /* type is float */ + /* floats are stored as 1 32 bit word on param stack */ + if (f < 13) { + fpr[f++] = *((float *)pStackLongs); + n+=1; + p++; + } else { + *((float *)p) = *((float *)pStackLongs); + p += 1; + } + pStackLongs += 1; + break; + + case 'H': /* type is long long */ + if (n < 8) + { + gpr[n++] = *pStackLongs; + p++; + } + else + *p++ = *pStackLongs; + if(n < 8) + { + gpr[n++] = *(pStackLongs+1); + p++; + } + else + *p++ = *(pStackLongs+1); + pStackLongs += 2; + break; + + case 'S': + if (n < 8) { + gpr[n++] = *((unsigned short*)pStackLongs); + p++; + } else { + *p++ = *((unsigned short *)pStackLongs); + } + pStackLongs += 1; + break; + + case 'B': + if (n < 8) { + gpr[n++] = *((char *)pStackLongs); + p++; + } else { + *p++ = *((char *)pStackLongs); + } + pStackLongs += 1; + break; + + default: + if (n < 8) { + gpr[n++] = *pStackLongs; + p++; + } else { + *p++ = *pStackLongs; + } + pStackLongs += 1; + break; + } + pPT++; + } + + + /* figure out the address of the function we need to invoke */ + off = nVtableIndex; + off = off * 4; // 4 bytes per slot + mfunc = *((unsigned long **)pAdjustedThisPtr); // get the address of the vtable + mfunc = (unsigned long *)((char *)mfunc + off); // get the address from the vtable entry at offset + mfunc = *((unsigned long **)mfunc); // the function is stored at the address + typedef void (*FunctionCall)(sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32, sal_uInt32); + FunctionCall ptr = (FunctionCall)mfunc; + + /* Set up the machine registers and invoke the function */ + + __asm__ __volatile__ ( + "lwz r3, 0(%0)\n\t" + "lwz r4, 4(%0)\n\t" + "lwz r5, 8(%0)\n\t" + "lwz r6, 12(%0)\n\t" + "lwz r7, 16(%0)\n\t" + "lwz r8, 20(%0)\n\t" + "lwz r9, 24(%0)\n\t" + "lwz r10, 28(%0)\n\t" + "lfd f1, 0(%1)\n\t" + "lfd f2, 8(%1)\n\t" + "lfd f3, 16(%1)\n\t" + "lfd f4, 24(%1)\n\t" + "lfd f5, 32(%1)\n\t" + "lfd f6, 40(%1)\n\t" + "lfd f7, 48(%1)\n\t" + "lfd f8, 56(%1)\n\t" + "lfd f9, 64(%1)\n\t" + "lfd f10, 72(%1)\n\t" + "lfd f11, 80(%1)\n\t" + "lfd f12, 88(%1)\n\t" + "lfd f13, 96(%1)\n\t" + : : "r" (gpr), "r" (fpr) + : "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", + "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", + "f10", "f11", "f12", "f13" + ); + + // tell gcc that r3 to r10 are not available to it for doing the TOC and exception munge on the func call + register sal_uInt32 r3 __asm__("r3"); + register sal_uInt32 r4 __asm__("r4"); + register sal_uInt32 r5 __asm__("r5"); + register sal_uInt32 r6 __asm__("r6"); + register sal_uInt32 r7 __asm__("r7"); + register sal_uInt32 r8 __asm__("r8"); + register sal_uInt32 r9 __asm__("r9"); + register sal_uInt32 r10 __asm__("r10"); + + (*ptr)(r3, r4, r5, r6, r7, r8, r9, r10); + + + __asm__ __volatile__ ( + "stw r3, %1\n\t" + "stw r4, %2\n\t" + "stfd f1, %0\n\t" + : : "m" (dret), "m" (iret), "m" (iret2) + ); + + + switch( eReturnType ) + { + case typelib_TypeClass_HYPER: + case typelib_TypeClass_UNSIGNED_HYPER: + ((long*)pRegisterReturn)[1] = iret2; + // fall thru on purpose + case typelib_TypeClass_LONG: + case typelib_TypeClass_UNSIGNED_LONG: + case typelib_TypeClass_ENUM: + ((long*)pRegisterReturn)[0] = iret; + break; + + case typelib_TypeClass_CHAR: + case typelib_TypeClass_SHORT: + case typelib_TypeClass_UNSIGNED_SHORT: + *(unsigned short*)pRegisterReturn = (unsigned short)iret; + break; + + case typelib_TypeClass_BOOLEAN: + case typelib_TypeClass_BYTE: + *(unsigned char*)pRegisterReturn = (unsigned char)iret; + break; + + case typelib_TypeClass_FLOAT: + *(float*)pRegisterReturn = (float)dret; + break; + + case typelib_TypeClass_DOUBLE: + *(double*)pRegisterReturn = dret; + break; + default: + break; + } +} + + +//================================================================================================== +static void cpp_call( + bridges::cpp_uno::shared::UnoInterfaceProxy * pThis, + bridges::cpp_uno::shared::VtableSlot aVtableSlot, + typelib_TypeDescriptionReference * pReturnTypeRef, + sal_Int32 nParams, typelib_MethodParameter * pParams, + void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc ) +{ + // max space for: [complex ret ptr], values|ptr ... + char * pCppStack = + (char *)alloca( sizeof(sal_Int32) + ((nParams+2) * sizeof(sal_Int64)) ); + char * pCppStackStart = pCppStack; + + // need to know parameter types for callVirtualMethod so generate a signature string + char * pParamType = (char *) alloca(nParams+2); + char * pPT = pParamType; + + // return + typelib_TypeDescription * pReturnTypeDescr = 0; + TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); + OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" ); + + void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion + + if (pReturnTypeDescr) + { + if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) + { + pCppReturn = pUnoReturn; // direct way for simple types + } + else + { + // complex return via ptr + pCppReturn = *(void **)pCppStack + = (bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr ) + ? alloca( pReturnTypeDescr->nSize ) + : pUnoReturn); // direct way + *pPT++ = 'C'; //signify that a complex return type on stack + pCppStack += sizeof(void *); + } + } + // push this + void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI()) + + aVtableSlot.offset; + *(void**)pCppStack = pAdjustedThisPtr; + pCppStack += sizeof( void* ); + *pPT++ = 'I'; + + // stack space + OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" ); + // args + void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams ); + // indizes of values this have to be converted (interface conversion cpp<=>uno) + sal_Int32 * pTempIndizes = (sal_Int32 *)(pCppArgs + nParams); + // type descriptions for reconversions + typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams)); + + sal_Int32 nTempIndizes = 0; + + for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos ) + { + const typelib_MethodParameter & rParam = pParams[nPos]; + typelib_TypeDescription * pParamTypeDescr = 0; + TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); + + if (!rParam.bOut + && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) + { + uno_copyAndConvertData( pCppArgs[nPos] = pCppStack, pUnoArgs[nPos], pParamTypeDescr, + pThis->getBridge()->getUno2Cpp() ); + + switch (pParamTypeDescr->eTypeClass) + { + + // we need to know type of each param so that we know whether to use + // gpr or fpr to pass in parameters: ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits