< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m

Print this page
rev 54094 : 8257853: Remove dependencies on JNF's JNI utility functions in AWT and 2D code
rev 54095 : 8259343: [macOS] Update JNI error handling in Cocoa code.
rev 54097 : 8259869: [macOS] Remove desktop module dependencies on JNF Reference APIs
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion


  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #import "PrinterView.h"
  27 
  28 #import "java_awt_print_Pageable.h"
  29 #import "java_awt_print_PageFormat.h"
  30 
  31 #import <JavaNativeFoundation/JavaNativeFoundation.h>
  32 
  33 #import "ThreadUtilities.h"
  34 #import "GeomUtilities.h"

  35 
  36 
  37 static JNF_CLASS_CACHE(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob");
  38 static JNF_CLASS_CACHE(sjc_PageFormat, "java/awt/print/PageFormat");
  39 
  40 @implementation PrinterView
  41 
  42 - (id)initWithFrame:(NSRect)aRect withEnv:(JNIEnv*)env withPrinterJob:(jobject)printerJob
  43 {
  44     self = [super initWithFrame:aRect];
  45     if (self)
  46     {
  47         fPrinterJob = JNFNewGlobalRef(env, printerJob);
  48         fCurPageFormat = NULL;
  49         fCurPainter = NULL;
  50         fCurPeekGraphics = NULL;
  51     }
  52     return self;
  53 }
  54 
  55 - (void)releaseReferences:(JNIEnv*)env
  56 {
  57     if (fCurPageFormat != NULL)
  58     {
  59         JNFDeleteGlobalRef(env, fCurPageFormat);
  60         fCurPageFormat = NULL;
  61     }
  62     if (fCurPainter != NULL)
  63     {
  64         JNFDeleteGlobalRef(env, fCurPainter);
  65         fCurPainter = NULL;
  66     }
  67     if (fCurPeekGraphics != NULL)
  68     {
  69         JNFDeleteGlobalRef(env, fCurPeekGraphics);
  70         fCurPeekGraphics = NULL;
  71     }
  72 }
  73 
  74 - (void)setFirstPage:(jint)firstPage lastPage:(jint)lastPage {
  75     fFirstPage = firstPage;
  76     fLastPage = lastPage;
  77 }
  78 
  79 - (void)drawRect:(NSRect)aRect
  80 {
  81     AWT_ASSERT_NOT_APPKIT_THREAD;
  82 
  83     static JNF_MEMBER_CACHE(jm_printToPathGraphics, sjc_CPrinterJob, "printToPathGraphics", "(Lsun/print/PeekGraphics;Ljava/awt/print/PrinterJob;Ljava/awt/print/Printable;Ljava/awt/print/PageFormat;IJ)V");




  84 
  85     // Create and draw into a new CPrinterGraphics with the current Context.
  86     assert(fCurPageFormat != NULL);
  87     assert(fCurPainter != NULL);
  88     assert(fCurPeekGraphics != NULL);
  89 
  90     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
  91 
  92     if ([self cancelCheck:env])
  93     {
  94         [self releaseReferences:env];
  95         return;
  96     }
  97 
  98     NSPrintOperation* printLoop = [NSPrintOperation currentOperation];
  99     jint jPageIndex = [printLoop currentPage] - 1;
 100 
 101     jlong context = ptr_to_jlong([printLoop context]);
 102     CGContextRef cgRef = (CGContextRef)[[printLoop context] graphicsPort];
 103     CGContextSaveGState(cgRef); //04/28/2004: state needs to be saved here due to addition of lazy state management
 104 
 105     JNFCallVoidMethod(env, fPrinterJob, jm_printToPathGraphics, fCurPeekGraphics, fPrinterJob, fCurPainter, fCurPageFormat, jPageIndex, context); // AWT_THREADING Safe (AWTRunLoop)


 106 
 107     CGContextRestoreGState(cgRef);
 108 
 109     [self releaseReferences:env];
 110 }
 111 
 112 - (NSString*)printJobTitle
 113 {
 114     AWT_ASSERT_NOT_APPKIT_THREAD;
 115 
 116     static JNF_MEMBER_CACHE(jm_getJobName, sjc_CPrinterJob, "getJobName", "()Ljava/lang/String;");
 117 
 118     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];


 119 
 120     jobject o = JNFCallObjectMethod(env, fPrinterJob, jm_getJobName); // AWT_THREADING Safe (known object)
 121     id result = JNFJavaToNSString(env, o);

 122     (*env)->DeleteLocalRef(env, o);
 123     return result;
 124 }
 125 
 126 - (BOOL)knowsPageRange:(NSRangePointer)aRange
 127 {
 128     AWT_ASSERT_NOT_APPKIT_THREAD;
 129 
 130     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
 131     if ([self cancelCheck:env])
 132     {
 133         return NO;
 134     }
 135 
 136     aRange->location = fFirstPage + 1;
 137 
 138     if (fLastPage == java_awt_print_Pageable_UNKNOWN_NUMBER_OF_PAGES)
 139     {
 140         aRange->length = NSIntegerMax;
 141     }
 142     else
 143     {
 144         aRange->length = (fLastPage + 1) - fFirstPage;
 145     }
 146 
 147     return YES;
 148 }
 149 
 150 - (NSRect)rectForPage:(NSInteger)pageNumber
 151 {
 152     AWT_ASSERT_NOT_APPKIT_THREAD;
 153 
 154     static JNF_MEMBER_CACHE(jm_getPageformatPrintablePeekgraphics, sjc_CPrinterJob, "getPageformatPrintablePeekgraphics", "(I)[Ljava/lang/Object;");
 155     static JNF_MEMBER_CACHE(jm_printAndGetPageFormatArea, sjc_CPrinterJob, "printAndGetPageFormatArea", "(Ljava/awt/print/Printable;Ljava/awt/Graphics;Ljava/awt/print/PageFormat;I)Ljava/awt/geom/Rectangle2D;");
 156     static JNF_MEMBER_CACHE(jm_getOrientation, sjc_PageFormat, "getOrientation", "()I");





 157 
 158     // Assertions removed, and corresponding JNFDeleteGlobalRefs added, for radr://3962543
 159     // Actual fix that will keep these assertions from being true is radr://3205462 ,
 160     // which will hopefully be fixed by the blocking AppKit bug radr://3056694
 161     //assert(fCurPageFormat == NULL);
 162     //assert(fCurPainter == NULL);
 163     //assert(fCurPeekGraphics == NULL);
 164 
 165     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
 166     if(fCurPageFormat != NULL) {
 167         JNFDeleteGlobalRef(env, fCurPageFormat);
 168     }
 169     if(fCurPainter != NULL) {
 170         JNFDeleteGlobalRef(env, fCurPainter);
 171     }
 172     if(fCurPeekGraphics != NULL) {
 173         JNFDeleteGlobalRef(env, fCurPeekGraphics);
 174     }
 175 
 176     //+++gdb Check the pageNumber for validity (PageAttrs)
 177 
 178     jint jPageNumber = pageNumber - 1;
 179 
 180     NSRect result;
 181 
 182     if ([self cancelCheck:env])
 183     {
 184         return NSZeroRect;
 185     }
 186 
 187     jobjectArray objectArray = JNFCallObjectMethod(env, fPrinterJob, jm_getPageformatPrintablePeekgraphics, jPageNumber); // AWT_THREADING Safe (AWTRunLoopMode)


 188     if (objectArray != NULL) {
 189         // Get references to the return objects -> PageFormat, Printable, PeekGraphics
 190         // Cheat - we know we either got NULL or a 3 element array
 191         jobject pageFormat = (*env)->GetObjectArrayElement(env, objectArray, 0);
 192         fCurPageFormat = JNFNewGlobalRef(env, pageFormat);
 193         (*env)->DeleteLocalRef(env, pageFormat);
 194 
 195         jobject painter = (*env)->GetObjectArrayElement(env, objectArray, 1);
 196         fCurPainter = JNFNewGlobalRef(env, painter);
 197         (*env)->DeleteLocalRef(env, painter);
 198 
 199         jobject peekGraphics = (*env)->GetObjectArrayElement(env, objectArray, 2);
 200         fCurPeekGraphics = JNFNewGlobalRef(env, peekGraphics);
 201         (*env)->DeleteLocalRef(env, peekGraphics);
 202 
 203         // Actually print and get the PageFormatArea
 204         jobject pageFormatArea = JNFCallObjectMethod(env, fPrinterJob, jm_printAndGetPageFormatArea, fCurPainter, fCurPeekGraphics, fCurPageFormat, jPageNumber); // AWT_THREADING Safe (AWTRunLoopMode)


 205         if (pageFormatArea != NULL) {
 206             NSPrintingOrientation currentOrientation =
 207                     [[[NSPrintOperation currentOperation] printInfo] orientation];
 208             // set page orientation
 209             switch (JNFCallIntMethod(env, fCurPageFormat, jm_getOrientation)) {
 210                 case java_awt_print_PageFormat_PORTRAIT:
 211                 default:
 212                     if (currentOrientation != NSPortraitOrientation) {
 213                         [[[NSPrintOperation currentOperation] printInfo]
 214                                             setOrientation:NSPortraitOrientation];
 215                     }
 216                     break;
 217 
 218                 case java_awt_print_PageFormat_LANDSCAPE:
 219                 case java_awt_print_PageFormat_REVERSE_LANDSCAPE:
 220                     if (currentOrientation != NSLandscapeOrientation) {
 221                         [[[NSPrintOperation currentOperation] printInfo]
 222                                             setOrientation:NSLandscapeOrientation];
 223                     }
 224                     break;
 225                 }

 226             result = JavaToNSRect(env, pageFormatArea);
 227             (*env)->DeleteLocalRef(env, pageFormatArea);
 228         } else {
 229             [self releaseReferences:env];
 230             result = NSZeroRect;
 231         }
 232 
 233         (*env)->DeleteLocalRef(env, objectArray);
 234     } else {
 235         [self releaseReferences:env];
 236         result = NSZeroRect;
 237     }
 238 
 239     return result;
 240 }
 241 
 242 - (BOOL)cancelCheck:(JNIEnv*)env
 243 {
 244     AWT_ASSERT_NOT_APPKIT_THREAD;
 245 
 246     static JNF_MEMBER_CACHE(jm_cancelCheck, sjc_CPrinterJob, "cancelCheck", "()Z");

 247 
 248     return JNFCallBooleanMethod(env, fPrinterJob, jm_cancelCheck); // AWT_THREADING Safe (known object)


 249 }
 250 
 251 // This is called by -[PrintModel safePrintLoop]
 252 - (void)complete:(JNIEnv*)env
 253 {
 254     AWT_ASSERT_NOT_APPKIT_THREAD;
 255 
 256     static JNF_MEMBER_CACHE(jf_completePrintLoop, sjc_CPrinterJob, "completePrintLoop", "()V");
 257     JNFCallVoidMethod(env, fPrinterJob, jf_completePrintLoop);

 258 
 259     // Clean up after ourselves
 260     // Can't put these into -dealloc since that happens (potentially) after the JNIEnv is stale
 261     [self releaseReferences:env];
 262     if (fPrinterJob != NULL)
 263     {
 264         JNFDeleteGlobalRef(env, fPrinterJob);
 265         fPrinterJob = NULL;
 266     }
 267 }
 268 
 269 - (BOOL)isFlipped
 270 {
 271     return TRUE;
 272 }
 273 
 274 @end


  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #import "PrinterView.h"
  27 
  28 #import "java_awt_print_Pageable.h"
  29 #import "java_awt_print_PageFormat.h"
  30 


  31 #import "ThreadUtilities.h"
  32 #import "GeomUtilities.h"
  33 #import "JNIUtilities.h"
  34 
  35 static jclass sjc_CPrinterJob = NULL;
  36 #define GET_CPRINTERJOB_CLASS() (sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob");
  37 #define GET_CPRINTERJOB_CLASS_RETURN(ret) GET_CLASS_RETURN(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob", ret);
  38 
  39 @implementation PrinterView
  40 
  41 - (id)initWithFrame:(NSRect)aRect withEnv:(JNIEnv*)env withPrinterJob:(jobject)printerJob
  42 {
  43     self = [super initWithFrame:aRect];
  44     if (self)
  45     {
  46         fPrinterJob = (*env)->NewGlobalRef(env, printerJob);
  47         fCurPageFormat = NULL;
  48         fCurPainter = NULL;
  49         fCurPeekGraphics = NULL;
  50     }
  51     return self;
  52 }
  53 
  54 - (void)releaseReferences:(JNIEnv*)env
  55 {
  56     if (fCurPageFormat != NULL)
  57     {
  58         (*env)->DeleteGlobalRef(env, fCurPageFormat);
  59         fCurPageFormat = NULL;
  60     }
  61     if (fCurPainter != NULL)
  62     {
  63         (*env)->DeleteGlobalRef(env, fCurPainter);
  64         fCurPainter = NULL;
  65     }
  66     if (fCurPeekGraphics != NULL)
  67     {
  68         (*env)->DeleteGlobalRef(env, fCurPeekGraphics);
  69         fCurPeekGraphics = NULL;
  70     }
  71 }
  72 
  73 - (void)setFirstPage:(jint)firstPage lastPage:(jint)lastPage {
  74     fFirstPage = firstPage;
  75     fLastPage = lastPage;
  76 }
  77 
  78 - (void)drawRect:(NSRect)aRect
  79 {
  80     AWT_ASSERT_NOT_APPKIT_THREAD;
  81 
  82     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
  83 
  84     GET_CPRINTERJOB_CLASS();
  85     DECLARE_METHOD(jm_printToPathGraphics, sjc_CPrinterJob, "printToPathGraphics",
  86                    "(Lsun/print/PeekGraphics;Ljava/awt/print/PrinterJob;Ljava/awt/print/Printable;Ljava/awt/print/PageFormat;IJ)V");
  87 
  88     // Create and draw into a new CPrinterGraphics with the current Context.
  89     assert(fCurPageFormat != NULL);
  90     assert(fCurPainter != NULL);
  91     assert(fCurPeekGraphics != NULL);
  92 


  93     if ([self cancelCheck:env])
  94     {
  95         [self releaseReferences:env];
  96         return;
  97     }
  98 
  99     NSPrintOperation* printLoop = [NSPrintOperation currentOperation];
 100     jint jPageIndex = [printLoop currentPage] - 1;
 101 
 102     jlong context = ptr_to_jlong([printLoop context]);
 103     CGContextRef cgRef = (CGContextRef)[[printLoop context] graphicsPort];
 104     CGContextSaveGState(cgRef); //04/28/2004: state needs to be saved here due to addition of lazy state management
 105 
 106     (*env)->CallVoidMethod(env, fPrinterJob, jm_printToPathGraphics, fCurPeekGraphics, fPrinterJob,
 107                            fCurPainter, fCurPageFormat, jPageIndex, context);
 108     CHECK_EXCEPTION();
 109 
 110     CGContextRestoreGState(cgRef);
 111 
 112     [self releaseReferences:env];
 113 }
 114 
 115 - (NSString*)printJobTitle
 116 {
 117     AWT_ASSERT_NOT_APPKIT_THREAD;
 118 


 119     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
 120     GET_CPRINTERJOB_CLASS_RETURN(nil);
 121     DECLARE_METHOD_RETURN(jm_getJobName, sjc_CPrinterJob, "getJobName", "()Ljava/lang/String;", nil);
 122 
 123     jobject o = (*env)->CallObjectMethod(env, fPrinterJob, jm_getJobName);
 124     CHECK_EXCEPTION();
 125     id result = JavaStringToNSString(env, o);
 126     (*env)->DeleteLocalRef(env, o);
 127     return result;
 128 }
 129 
 130 - (BOOL)knowsPageRange:(NSRangePointer)aRange
 131 {
 132     AWT_ASSERT_NOT_APPKIT_THREAD;
 133 
 134     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
 135     if ([self cancelCheck:env])
 136     {
 137         return NO;
 138     }
 139 
 140     aRange->location = fFirstPage + 1;
 141 
 142     if (fLastPage == java_awt_print_Pageable_UNKNOWN_NUMBER_OF_PAGES)
 143     {
 144         aRange->length = NSIntegerMax;
 145     }
 146     else
 147     {
 148         aRange->length = (fLastPage + 1) - fFirstPage;
 149     }
 150 
 151     return YES;
 152 }
 153 
 154 - (NSRect)rectForPage:(NSInteger)pageNumber
 155 {
 156     AWT_ASSERT_NOT_APPKIT_THREAD;
 157 
 158     JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
 159     GET_CPRINTERJOB_CLASS_RETURN(NSZeroRect);
 160     DECLARE_METHOD_RETURN(jm_getPageformatPrintablePeekgraphics, sjc_CPrinterJob,
 161                            "getPageformatPrintablePeekgraphics", "(I)[Ljava/lang/Object;", NSZeroRect);
 162     DECLARE_METHOD_RETURN(jm_printAndGetPageFormatArea, sjc_CPrinterJob, "printAndGetPageFormatArea",
 163                           "(Ljava/awt/print/Printable;Ljava/awt/Graphics;Ljava/awt/print/PageFormat;I)Ljava/awt/geom/Rectangle2D;", NSZeroRect);
 164     DECLARE_CLASS_RETURN(sjc_PageFormat, "java/awt/print/PageFormat", NSZeroRect);
 165     DECLARE_METHOD_RETURN(jm_getOrientation, sjc_PageFormat, "getOrientation", "()I", NSZeroRect);
 166 
 167     // Assertions removed, and corresponding DeleteGlobalRefs added, for radr://3962543
 168     // Actual fix that will keep these assertions from being true is radr://3205462 ,
 169     // which will hopefully be fixed by the blocking AppKit bug radr://3056694
 170     //assert(fCurPageFormat == NULL);
 171     //assert(fCurPainter == NULL);
 172     //assert(fCurPeekGraphics == NULL);
 173 

 174     if(fCurPageFormat != NULL) {
 175         (*env)->DeleteGlobalRef(env, fCurPageFormat);
 176     }
 177     if(fCurPainter != NULL) {
 178         (*env)->DeleteGlobalRef(env, fCurPainter);
 179     }
 180     if(fCurPeekGraphics != NULL) {
 181         (*env)->DeleteGlobalRef(env, fCurPeekGraphics);
 182     }
 183 
 184     //+++gdb Check the pageNumber for validity (PageAttrs)
 185 
 186     jint jPageNumber = pageNumber - 1;
 187 
 188     NSRect result;
 189 
 190     if ([self cancelCheck:env])
 191     {
 192         return NSZeroRect;
 193     }
 194 
 195     jobjectArray objectArray = (*env)->CallObjectMethod(env, fPrinterJob,
 196                                 jm_getPageformatPrintablePeekgraphics, jPageNumber);
 197     CHECK_EXCEPTION();
 198     if (objectArray != NULL) {
 199         // Get references to the return objects -> PageFormat, Printable, PeekGraphics
 200         // Cheat - we know we either got NULL or a 3 element array
 201         jobject pageFormat = (*env)->GetObjectArrayElement(env, objectArray, 0);
 202         fCurPageFormat = (*env)->NewGlobalRef(env, pageFormat);
 203         (*env)->DeleteLocalRef(env, pageFormat);
 204 
 205         jobject painter = (*env)->GetObjectArrayElement(env, objectArray, 1);
 206         fCurPainter = (*env)->NewGlobalRef(env, painter);
 207         (*env)->DeleteLocalRef(env, painter);
 208 
 209         jobject peekGraphics = (*env)->GetObjectArrayElement(env, objectArray, 2);
 210         fCurPeekGraphics = (*env)->NewGlobalRef(env, peekGraphics);
 211         (*env)->DeleteLocalRef(env, peekGraphics);
 212 
 213         // Actually print and get the PageFormatArea
 214         jobject pageFormatArea = (*env)->CallObjectMethod(env, fPrinterJob, jm_printAndGetPageFormatArea, fCurPainter,
 215                                     fCurPeekGraphics, fCurPageFormat, jPageNumber);
 216         CHECK_EXCEPTION();
 217         if (pageFormatArea != NULL) {
 218             NSPrintingOrientation currentOrientation =
 219                     [[[NSPrintOperation currentOperation] printInfo] orientation];
 220             // set page orientation
 221             switch ((*env)->CallIntMethod(env, fCurPageFormat, jm_getOrientation)) {
 222                 case java_awt_print_PageFormat_PORTRAIT:
 223                 default:
 224                     if (currentOrientation != NSPortraitOrientation) {
 225                         [[[NSPrintOperation currentOperation] printInfo]
 226                                             setOrientation:NSPortraitOrientation];
 227                     }
 228                     break;
 229 
 230                 case java_awt_print_PageFormat_LANDSCAPE:
 231                 case java_awt_print_PageFormat_REVERSE_LANDSCAPE:
 232                     if (currentOrientation != NSLandscapeOrientation) {
 233                         [[[NSPrintOperation currentOperation] printInfo]
 234                                             setOrientation:NSLandscapeOrientation];
 235                     }
 236                     break;
 237                 }
 238             CHECK_EXCEPTION();
 239             result = JavaToNSRect(env, pageFormatArea);
 240             (*env)->DeleteLocalRef(env, pageFormatArea);
 241         } else {
 242             [self releaseReferences:env];
 243             result = NSZeroRect;
 244         }
 245 
 246         (*env)->DeleteLocalRef(env, objectArray);
 247     } else {
 248         [self releaseReferences:env];
 249         result = NSZeroRect;
 250     }
 251 
 252     return result;
 253 }
 254 
 255 - (BOOL)cancelCheck:(JNIEnv*)env
 256 {
 257     AWT_ASSERT_NOT_APPKIT_THREAD;
 258 
 259     GET_CPRINTERJOB_CLASS_RETURN(NO);
 260     DECLARE_METHOD_RETURN(jm_cancelCheck, sjc_CPrinterJob, "cancelCheck", "()Z", NO);
 261 
 262     BOOL b = (*env)->CallBooleanMethod(env, fPrinterJob, jm_cancelCheck); // AWT_THREADING Safe (known object)
 263     CHECK_EXCEPTION();
 264     return b;
 265 }
 266 
 267 // This is called by -[PrintModel safePrintLoop]
 268 - (void)complete:(JNIEnv*)env
 269 {
 270     AWT_ASSERT_NOT_APPKIT_THREAD;
 271 
 272     DECLARE_METHOD(jf_completePrintLoop, sjc_CPrinterJob, "completePrintLoop", "()V");
 273     (*env)->CallVoidMethod(env, fPrinterJob, jf_completePrintLoop);
 274     CHECK_EXCEPTION();
 275 
 276     // Clean up after ourselves
 277     // Can't put these into -dealloc since that happens (potentially) after the JNIEnv is stale
 278     [self releaseReferences:env];
 279     if (fPrinterJob != NULL)
 280     {
 281         (*env)->DeleteGlobalRef(env, fPrinterJob);
 282         fPrinterJob = NULL;
 283     }
 284 }
 285 
 286 - (BOOL)isFlipped
 287 {
 288     return TRUE;
 289 }
 290 
 291 @end
< prev index next >