読者です 読者をやめる 読者になる 読者になる

Lotus Notes 6.5のカレンダーをGoogle Calendarへ転送するRubyスクリプト(3)-notes_lib.rb の修正

notes_lib.rbをLotus Notes 6.5で使用したときの問題

Lotus Notes 6.5のカレンダーをGoogle Calendarへ転送するRubyスクリプト - dogatanaの日記のように、notes_lib.rb をNotes 6.5で使用すると

  • Dominoオブジェクトの全てのメソッドが使えない
  • スクリプト実行時、Notesクライアントが起動されている必要がある(起動されていなければ自動的に起動されるのですが)
  • Notesデータベースにアクセスする際、場合によりNotesクライアント側でパスワードを入力する必要がある

などの不都合があります。
特にスクリプトがNotesクラアントに依存するのが厄介で、自動ログオフ設定にしていると、パスワードが入力されるまでスクリプトがとまります。
DominoオブジェクトにはInitializeというメソッドがあり、パスワードを引数にして呼び出せるのですが、普通に Notes::NotesSession.new しただけではこのメソッドを呼び出すことができないのです。

原因

これらはいずれもCOMEオブジェクトを生成するときの ProgID が 'Notes.NotesSession' となっているのが原因のようで、それを'Lotus.NotesSession' に変更することで回避できます。Domino 6.5のオンラインヘルプで ProgID が違うのに気がつきました。
このうちパスワードについては、Initialzeメソッドの引数で渡すか、空文字列を渡すと、Notesクラアントでなく、Rubyが開くコンソール側で入力すればよくなるようです。

回避策

そこで、notes_libでCOMオブジェクトを初期化している部分を修正するためのスクリプトを作成しました。これを次のように使用するれば問題を回避できます。

require 'notes_lib'
require 'notes_lib_sup'

ns = Notes::NotesSession.new('Lotus.NotesSession')
ns.Initilaize('password')
db = ns.GetDatabase('', 'mail/mail.nsf')
# 以下省略

この前まで、既存のクラスのメソッドを変更できるというのを知らなかったので、http://d.hatena.ne.jp/dogatana/20090131/1233370035では直接win32ole を使用しているのですが、こちらの方がスマートですね。


notes_lib_sub.rbソース

# replace constructor of Notes::NotesSession
# notes_lib_sup.rb - http://d.hatena.ne.jp/dogatana/20090207/1233989327
# original notes_lib.rb is on http://www.tech-notes.dyndns.org/notes_lib/
class Notes
  class NotesSession < Notes_Wrapper
    def initialize(progID = 'Notes.NotesSession')
      if @@ns
        @raw_object = @ns
      else
        @raw_object = WIN32OLE.new(progID)
        # WIN32OLE.my_const_load(@raw_object, Notes)
      end
    end
  end
end