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

 

5
 
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

Any luck with making sense of Entourage 2008?

I’d really like to implement a GPG plug-in if possible…

ys Benjamin
   
Says Benjamin Donnachie on

So Christopher,
I know I’m a little late on the thread but, thanks for this post.. Very interesting.
I was actually looking for a way to add a custom plug-in to entourage but the people at Microsoft confirmed there is no official way to do that. Do you efforts still remain unsuccessful in developing that?

   
Says Sammy on

still no progress

ys Christop
   
Says Christopher Atlan on

Leave a Reply