Microsoft Entourage 2008 Plug-in development

Entourage Icon

Today is the release day of Microsoft Office for Mac 2008. Let’s take a look if it is possible to develop a Plug-in for Entourage 2008.

As far as I know, there was no way in Entourage 2004 for a Third Party Developer, and there is still no support from Microsoft. But after four years, things a little different now…

In the Entourage application bundle I discovered a Plugins folder, which contain a Plug-in named EntouragePrintPDE. So what is EntouragePrintPDE? This is an Extending Printing Dialogs Plug-in, I found a example for such a Plug-in at mozilla.

Bild 1.png

So here we go, lets learn more about CFPlugIn, which is little uncommon for us Cocoa guys who use NSBundle. BasicPlugIn is a good example to start with.

And yeah, after setting up a Xcode project with this I was able get the Plug-in loaded:

Bild 3.png

This is not all good news. Because it is based on a Extending Printing Dialogs Plug-in, it gets only loaded when you open the print dialog. The CFPlugInTypes UUID in the Info.plist is BCB07250-E57F-11D3-8CA6-0050E4603277 which described as “Application pane for the Print dialog” Interface type:

Bild 4.png

Is this the end of the story? Almost, without Interface descriptions and the UUIDs we are out of luck here. I searched for standard UUIDs, but didn’t find any “load on start of host app” UUIDs.

But wait, I don’t like to close this with a “it’s impossible, don’t even dream of it”. Here the class-dump output of Entourage 2008. It is pretty short for such a big application because it is mostly a Carbon application, never mind, I like what it shows.

  1. /*
  2.  *     Generated by class-dump 3.1.1.
  3.  *
  4.  *     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2006 by Steve Nygard.
  5.  */
  6.  
  7. struct CToolTip;
  8.  
  9. struct CURLToolTip {
  10.     struct CToolTip *_field1;
  11. };
  12.  
  13. struct OpaqueMenuRef;
  14.  
  15. struct _NSPoint {
  16.     float _field1;
  17.     float _field2;
  18. };
  19.  
  20. struct _NSZone;
  21.  
  22. struct __CFString;
  23.  
  24. /*
  25.  * File: /Applications/Microsoft Office 2008/Microsoft Entourage.app/Contents/MacOS/Microsoft Entourage
  26.  * Arch: Intel 80×86 (i386)
  27.  */
  28.  
  29. @protocol NSObject
  30. - (BOOL)isEqual:(id)fp8;
  31. - (unsigned int)hash;
  32. - (Class)superclass;
  33. - (Class)class;
  34. - (id)self;
  35. - (struct _NSZone *)zone;
  36. - (id)performSelector:(SEL)fp8;
  37. - (id)performSelector:(SEL)fp8 withObject:(id)fp12;
  38. - (id)performSelector:(SEL)fp8 withObject:(id)fp12 withObject:(id)fp16;
  39. - (BOOL)isProxy;
  40. - (BOOL)isKindOfClass:(Class)fp8;
  41. - (BOOL)isMemberOfClass:(Class)fp8;
  42. - (BOOL)conformsToProtocol:(id)fp8;
  43. - (BOOL)respondsToSelector:(SEL)fp8;
  44. - (id)retain;
  45. - (oneway void)release;
  46. - (id)autorelease;
  47. - (unsigned int)retainCount;
  48. - (id)description;
  49. @end
  50.  
  51. @protocol WebDocumentText <NSObject>
  52. - (BOOL)supportsTextEncoding;
  53. - (id)string;
  54. - (id)attributedString;
  55. - (id)selectedString;
  56. - (id)selectedAttributedString;
  57. - (void)selectAll;
  58. - (void)deselectAll;
  59. @end
  60.  
  61. @interface NSView (Undocumented)
  62. - (void)preparePageForPrinting:(float)fp8;
  63. @end
  64.  
  65. @interface MessagePrintoutController : NSObject
  66. {
  67.     BOOL loading;
  68. }
  69.  
  70. - (BOOL)isLoading;
  71. - (void)setLoading:(BOOL)fp8;
  72. - (void)webView:(id)fp8 didStartProvisionalLoadForFrame:(id)fp12;
  73. - (void)webView:(id)fp8 didFinishLoadForFrame:(id)fp12;
  74. - (void)webView:(id)fp8 didFailProvisionalLoadWithError:(id)fp12 forFrame:(id)fp16;
  75. - (void)webView:(id)fp8 didFailLoadWithError:(id)fp12 forFrame:(id)fp16;
  76.  
  77. @end
  78.  
  79. @interface MessageViewController : NSObject
  80. {
  81.     WebView *webView;
  82.     void *view;
  83.     id messageRecordID;
  84.     BOOL networkBlocked;
  85.     BOOL networkResources;
  86.     NSURL *hrefURL;
  87.     NSString *currentURL;
  88.     NSString *currentHRef;
  89.     struct CURLToolTip *toolTip;
  90. }
  91.  
  92. + (void)initialize;
  93. - (void)dealloc;
  94. - (id)init;
  95. - (id)webView;
  96. - (void)setWebView:(id)fp8;
  97. - (void *)view;
  98. - (void)setView:(void *)fp8;
  99. - (void *)message;
  100. - (void)setMessage:(void *)fp8;
  101. - (BOOL)isNetworkBlocked;
  102. - (void)setNetworkBlocked:(BOOL)fp8;
  103. - (BOOL)hasNetworkResources;
  104. - (void)buildExecuteScriptMenu:(struct OpaqueMenuRef *)fp8 withParent:(id)fp12;
  105. - (void)openLink:(id)fp8;
  106. - (void)copyImage:(id)fp8;
  107. - (void)openImage:(id)fp8;
  108. - (void)executeScriptCommand:(id)fp8;
  109. - (struct __CFString *)getSelectedText;
  110. - (void)selectAllCommand:(id)fp8;
  111. - (void)decreaseFontSizeCommand:(id)fp8;
  112. - (void)increaseFontSizeCommand:(id)fp8;
  113. - (void)translateCommand:(id)fp8;
  114. - (void)dictionaryCommand:(id)fp8;
  115. - (void)synonymCommand:(id)fp8;
  116. - (void)encyclopediaCommand:(id)fp8;
  117. - (void)webSearchCommand:(id)fp8;
  118. - (void)helpCommand:(id)fp8;
  119. - (void)download:(id)fp8 decideDestinationWithSuggestedFilename:(id)fp12;
  120. - (void)webView:(id)fp8 didStartProvisionalLoadForFrame:(id)fp12;
  121. - (void)webView:(id)fp8 decidePolicyForNewWindowAction:(id)fp12 request:(id)fp16 newFrameName:(id)fp20 decisionListener:(id)fp24;
  122. - (void)webView:(id)fp8 decidePolicyForNavigationAction:(id)fp12 request:(id)fp16 frame:(id)fp20 decisionListener:(id)fp24;
  123. - (id)webView:(id)fp8 resource:(id)fp12 willSendRequest:(id)fp16 redirectResponse:(id)fp20 fromDataSource:(id)fp24;
  124. - (void)webView:(id)fp8 willPerformDragSourceAction:(int)fp12 fromPoint:(struct _NSPoint)fp16 withPasteboard:(id)fp24;
  125. - (void)webView:(id)fp8 mouseDidMoveOverElement:(id)fp12 modifierFlags:(unsigned int)fp16;
  126. - (id)webView:(id)fp8 contextMenuItemsForElement:(id)fp12 defaultMenuItems:(id)fp16;
  127.  
  128. @end
  129.  
  130. @interface MessageViewController (Private)
  131. - (void)decidePolicyForAction:(id)fp8 request:(id)fp12 decisionListener:(id)fp16;
  132. - (struct _NSPoint)mouseLocation;
  133. @end
  134.  
  135. @interface MHTMLProtocol : NSURLProtocol
  136. {
  137. }
  138.  
  139. + (BOOL)canInitWithRequest:(id)fp8;
  140. + (id)canonicalRequestForRequest:(id)fp8;
  141. - (id)initWithRequest:(id)fp8 cachedResponse:(id)fp12 client:(id)fp16;
  142. - (void)startLoading;
  143. - (void)stopLoading;
  144.  
  145. @end
  146.  
  147. @interface NetworkBlock : NSURLProtocol
  148. {
  149. }
  150.  
  151. + (BOOL)canInitWithRequest:(id)fp8;
  152. + (id)canonicalRequestForRequest:(id)fp8;
  153. - (id)initWithRequest:(id)fp8 cachedResponse:(id)fp12 client:(id)fp16;
  154. - (void)startLoading;
  155. - (void)stopLoading;
  156.  
  157. @end

 

2
 
del.icio.us digg

Ah - i just emailed you asking for info on OMIC for Entourage. I should have checked your blog first…
It’s a shame you are not looking at Entourage 2004 as many of us are will not be upgrading to 2008 for some time. Reportedly it is a very bad upgrade.

ys Pe
   
Says Peter on

Hi Peter,

the problem is there is no official way to develop plug-ins for Entourage 2004 or 2008. But I hoped that it is possible in Entourage 2008 over hacking, but my efforts remained unsuccessfully.

Christopher

   
Says Christopher Atlan on

Leave a Reply