SlideShare a Scribd company logo
1 of 58
Download to read offline
Calling the Notes
     C API from
     LotusScript
               Bill Buchan
             Director, HADSL



                                                    Powered by
Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Target and Purpose
• Who is the target audience?
  – Advanced Lotus Notes Developers.
  – Developers who have a little experience in the C API.
• What is this about?
  – This talk aims to demonstrate advanced LotusScript,
    showing:
     • The Notes C API interface.
     • The LSX interface.
     • Pros and cons of each.


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Notes C API
• Why Notes C API?
  – 900+ Supported Methods.
  – Many complex tasks can be called via API.
• Who am I?
  – Bill Buchan.
  – Dual PCLP in v3, v4, v5, v6, v7.
  – CEO of HADSL—developing best-practice tools.



                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Notes C API Programming Toolkit
• Where can you find information on the C API?
  – The Lotus Notes C Programming toolkit.
• The toolkit contains:
  – Contains two documentation databases.
  – Each function and structure is documented.
  – A large number of sample C programs are included.
  – Compile time libraries for all platforms.
• Generally speaking backward compatibility is good:
  – For instance, if you have v6 and v7 servers, creating the program
    using v6 of the API toolkit means that it will run on v6 and v7
    servers.
                                                                    Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Notes/Domino Architectures
• Domino is a multi-platform server product.
• Notes now supports four clients:
  – Windows, Mac (Power PC), Mac (Intel), Linux.
• LotusScript supported from v4.x of Notes.
  – Rich set of APIs for general business logic.
  – Robust, supported environment.
  – Amazing level of multi-platform support.
• What if you want to go further?
  – Exploit a piece of Notes C API interface?
  – Call a platform specific DLL?                                 Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
But Surely
• Currently, something like:
  – 90% of all Domino servers run on Windows.
  – 95% of all Notes clients run on Windows.
• Why not write platform code for that and that alone?
  – A short sighted decision. Your environment will change.
  – Windows 64-bit coming over the horizon.
     • Treat it as a separate platform - as was 16-bit Windows.
• Corporate push to centralize and consolidate.
  – Especially on medium-high level platforms.
     • Linux, Solaris, AIX, HP/UX.
                                                                    Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Be Pragmatic—The Skills Triangle

  Few Code Examples                        Harder,
                                          Expensive


        C-API




    LotusScript, Java

                                                     Easier,
    Many Code Examples                              Cheaper
                                                           Powered by
       Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Be Pragmatic
• Call the Notes C API from LotusScript if:
  – You cannot find a supported architectural solution.
  – You have the skills to support LSX and/or Notes C API
    coding.
  – You might possibly require multi-platform code.
  – You accept that this code will be harder to write, harder
    to maintain, and harder to support.




                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Architectures—Conclusion
• If you have to step outside the comfort zone, you
  have two choices:
  – LotusScript eXtension Toolkit—LSX.
     • This builds a library—on windows, a DLL—which allows you
       to extend LotusScript with custom C code.
     • Fairly straightforward.
     • A different version for each platform.
  – LotusScript calling the Notes C API interface directly.
     • Not straightforward.
     • One code base can cover all platforms.

                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What is the LSX Toolkit?
• A C-based API for Lotus Notes.
  – Interfaces with LotusScript.
  – Allows you to build platform-specific libraries.
  – Pros:
     • Straightforward for a competent C Programmer.
  – Cons:
     • Platform—and sometimes version(!)—specific.
        – You have to produce a version for each platform.
     • Lack of support.
        – Last release – March 2001.
        – Visual Studio 2005 not supported.
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What is the LSX Toolkit good for?
• Used to use it for Notes Database work.
  – We have a Notes Database installer which unpacks,
    design refreshes, sets ACLs, etc.
  – Initially coded that as LSX.
  – Now use LotusScript calls to Notes C API directly.
     • Deployment of LSXs is non-trivial.
     • Especially updating LSXs that are in use!
• Still use it for Active Directory Integration.
  – AD integration possible using LotusScript/COM
    interface – but unreliable.
  – Code ADSI to manage objects within AD
                                                                    Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
How can you create an LSX?
• Design a data structure you wish to expose in LotusScript.
• Use the LSX Wizard to create a relevant LSX project.
• Use a supported C-Compiler for your platform(s) to create code
  to fill in the blanks.
• Run Do_It to compile your library.
   – Windows produces a .DLL file.
   – *nix produces a .so file.
• Place that library in the executable code directory of your server
  and/or client.
• Test, test, test!

                                                                     Powered by
                 Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (1)
• Create a new
  Project.




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (2)
• Now add a
  class to the
  project.




                                                                     Powered by
                 Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (3)
• Override
  the
  Constructor.




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (4)
• Add a
  “Close”
  Sub.




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (5)
• Add a Getter and
  Setter.




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (6)
• You should now see this:




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (7)
• Now generate code.




                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (8)
• Now fill in the code in the LSX source files.



//{{LSX_AUTHOR_CODE_Include_1
//}}

#include "DbReplicaFlags.hpp"
// includes for the objects defined in your LSX
//{{LSX_AUTHOR_CODE_Include_2
//}}


                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (9)
• Now fill in the code in the LSX source files.
DbReplicaFlags:: DbReplicaFlags( LSPTR(LSXLsiSession)
   pContainer, LSXString& Server, LSXString& Database)
   : LSXBase((LSPLTSTR)"DbReplicaFlags", pContainer-
   >LSXGetInstance(),
        CDBREPLICAFLAGS_DBREPLICAFLAGS_ID, pContainer)
   //{{LSX_AUTHOR_CODE_Additional_Base_Class_Init1
   //}}

    //{{LSX_AUTHOR_CODE_Internal_Member_Init1
    //}}
{
    //{{LSX_AUTHOR_CODE_Constructor1
    //}}

}

                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (10)
• Run a command prompt.
   – Go to the LSX directory.
   – Run LSXSetup W32.
   – Run cd DbReplicaFlags.
   – Run Do_it.
      • This will compile the DLL file.
   – Copy the DLL from lsxbinw32DbReplicaFlags.dll to your Notes
     Program Directory.
• Note:
   – The Notes client (or server) usually holds onto the DLL once loaded,
     so refreshing the LSX usually requires a client (or server) restart.



                                                                     Powered by
                 Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (11)
• Create a LotusScript Agent:
Uselsx “DbReplicaFlags.dll”              ' in 'Options'

Sub Initialize
    Dim DR As New DbReplicaFlags("", "names.nsf")
    Dim value As Integer

   If dr.GetDbReplicaFlag(REPLFLG_DISABLE, value) Then

       If (value) Then
           Print "Replica Disable is set to 'TRUE'"
       Else
           Print "Replica Disable is set to 'False'"
       End If
   Else
       Print "I failed to get the replica flag "
   End If

    Call dr.NSFDbClose()
End Sub
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Wizard (12)
• As a side effect of loading the LSX.
  – The LSX signature is now available in the designer.




                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX Summary
• LSX Toolkit is fairly straightforward.
• Since the LSX Toolkit supports multiple platforms
  and the same source code is used on each:
  – You do have to recompile the LSX on multiple
    platforms.
  – You don’t have to take account of many platform
    differences.
• It’s good for extending your code to new APIs.
  – EG: You can call Active Directory API calls in order to
    integrate Domino with Active Directory
                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Platform Differences: Definitions
• In normal LotusScript, platform differences are taken care of.
   – Even in LSX programming most differences are taken care
     of.
   – Not so in direct LotusScript to C API calls.
• Each platform represents data in a subtly different manner.
   – For instance, the HANDLE datatype has different lengths
     on different platforms:
      • 32 bits long in Windows and OS/400.
      • 16 bits long on AIX, Macintosh, etc.
   – Memory alignment widths on iSeries are different from
     other platforms.
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Platform Specific implementations
• In order to call the Notes library, you will have to link to
  different library files on each platform:
   – Windows/32:               nnotes.dll
   – Solaris, Linux:           libnotes.so
   – AIX:                      lnotes_r.a
   – HPUX:                     libnotes.sl
   – MacOs, OS/X:              NotesLib
   – OS/400:                   libnotes.srvpgm
   – OS/390                    libnotes
   – OS/2:                     lnotes.dll
                                                                    Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Platform Differences: Endians
• Endians:
  – Some platforms represent multi-byte numbers numbers
    with the lowest value bytes in the lower segments of
    memory—little endians.
  – Macintosh (on PowerPC!) represents the larger value
    bytes in the lower segments of memory—big endians.




                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Coding for platform differences
• Our challenge is to construct a code sequence that:
   – Knows which platform it’s running on.
   – Makes calls to the platform-specific library file.
   – Understands platform differences in terms of alignment
     and data item size.
   – And most importantly—fails “safe” when presented
     with a new platform that it cannot deal with.
• This is not a trivial exercise.
   – My estimate is that this exercise will take at least 5-10
     times more effort—development + testing—than a
     normal LotusScript business function.                  Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Decoding Signatures
• A “Signature” is:
   – The definition of a function calls' parameters and return value.
   – These are found in the Notes “C API 7.0 Reference”:
      • Example signature:
           STATUS LNPUBLIC NSFNoteLSCompile(
           DBHANDLE hDb, NOTEHANDLE hNote, DWORD        dwFlags);
      • In Windows:
           Declare Function W32_NSFLSCompile Lib LIB_W32
           Alias "NSFNoteLSCompile"
           ByVal hdb As Long,
           ByVal hNote As Long,
           ByVal null1 As Long )
           As Integer




                                                                        Powered by
                  Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Decoding Signatures (cont.)
C-API        W in32       Linux        AIX         Solaris      Mac
BYTE         BYTE         BYTE         BYTE        BYTE         BYTE
BOOL         Long         Long         Long        Long         Integer
Int          Long         Long         Long        Long         Long
Long Int     Long         Long         Long        Long         Long
WORD         Integer      Integer      Integer     Integer      Integer
SWORD        Integer      Integer      Integer     Integer      Integer
DWORD        Long         Long         Long        Long         Long
LONG Int     Long         Long         Long        Long         Long
HANDLE       Long         Integer      Integer     Integer      Integer
NOTEHANDLE   Long         Integer      Integer     Integer      Integer
DBHANDLE     Long         Integer      Integer     Integer      Integer
MEMHANDLE    Long         Long         Long        Long         Long
STATUS       Integer      Integer      Integer     Integer      Integer
Char *       String       String       String      String       String


                                                                     Powered by
                 Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Calling a simple C API function
• Let’s get our feet wet with some simple API.
   – No complex sequence of calls handling a shared memory
     resource - A single call with simple datatypes.
   – A call that will not result in client memory corruption
     should we get it wrong. Hopefully.
• Let’s call it from Windows and ignore other platforms.
   – A function that tells you the network latency—in
     milliseconds— between the current Notes instance and a
     target server:
      • NSFGetServerLatency

                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
NSFGetServerLatency()
• We shall call:
  – NSFGetServerLatency().
  – Returns the network latency time (in ms) to a remote server.
  – Shows which server is closest in terms of network respose.
  – Its signature from the C API reference is:
      STATUS LNPUBLIC NSFGetServerLatency(
         char far *ServerName,
         DWORD Timeout,
         DWORD far *retClientToServerMS,
         DWORD far *retServerToClientMS,
         WORD far *ServerVersion);

                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
NSFGetServerLatency()
• From the C API Reference:
Input Parameters
ServerName—Null-terminated string containing the name of the server to query.
Timeout—Number of milliseconds to wait for a reply from the server. A timeout of
   0 indicates that the default timeout value is to be used.
Output Parameters
(routine) - Return status from this call:
NOERROR - Success
retClientToServerMS - Optional - If not NULL, the number of milliseconds
   required to send the request to the server is stored at this address.
retServerToClientMS - Optional - If not NULL, the number of milliseconds
   required for the reply to return from the server is stored at this address.
ServerVersion - Optional - If not NULL, the server version (the Domino build
   number for the server) is stored at this address.

                                                                        Powered by
                    Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Simple C API Calling:
' This is a constant for our windows-based
' Library file:
Const LIB_W32 = "nnotes.dll"

' Declare our function for windows
Declare Function W32_NSFGetServerLatency _
   Lib LIB_W32 Alias {NSFGetServerLatency} (_
   Byval ServerName As Lmbcs String, _
   Byval Timeout As Long, _
   retClientToServerMS As Long, _
   retServerToClientMS As Long, _
   ServerVersion As Integer) As Integer
                                                                Powered by
            Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Simple C API Calling: Execution
' A function to get network latency time...
Public Function getServerLatency _
(strServer As String) As Long
   Dim nnServer As New NotesName(strServer)
   Dim ToServer As Long, fromServer As Long
   Dim ver As Integer
   Dim timeout As Long

  timeout = 1000             ' 1000ms == 1 second

  Call W32_NSFGetServerLatency(nnServer.Canonical,_ timeout,
    toServer, fromServer, ver)

   ' Return both directional latencies added together
   getServerLatency = fromServer + ToServer
End Function
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Simple C API Calling: Execution
Sub initialise
   Print “Calling function”
   Print “Latency is: “ + _
      cstr(getServerLatency(“domino-
       90.hadsl.com/HADSL/US”))
   Print “Finished calling”
end sub




                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Simple C API Calling: The Results
• Running the agent “Example1” in the database
  produces the following runtime output:




• Now—this is not production code! It requires:
  – Error handling.
  – Multi-platform support.

                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What Can’t You Call?
• Callback routines
  – Some Notes C API functions require you to specify
    mandatory callback routines—other pieces of C API
    that will get called by the target C API routine.
     • LotusScript does not (and IMHO never will) support this.
     • This rules out Extension Manager Routines, Menu Addin
       Routines.
  – In terms of callback routines that allow you to specify
    optional callbacks (progress status indicators, etc), you
    can pass in NULL (or ZERO), and the callback
    function will be ignored.
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll Cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Defining complex C API
• Complex C API is where:
  – More than one function call is required to perform a
    task.
     • and/or
  – A HANDLE of some description is needed to reference
    a data object.




                                                                    Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
API handles
• A handle is a numeric reference to a structure in
  memory that the C API interface has created.
  – For example, a handle to a Notes Database.
• You do not deal with the memory structure itself—
  you deal with the handle to the memory structure.
  – Example: NSFDbOpen() creates a new memory
    structure and gives you back the handle to that.
  – You perform some work using NSFDInfoGet()
  – You close the database using NSFDbClose().

                                                                 Powered by
             Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Some Rules on handles
• There are different types of handles:
   – Document handle, database handle, etc.
   – Do not mix these handles up!
      • Doing so will crash the session/client/server.
• Always properly close your handles:
   – You have to properly trap all code branches.
   – You have to keep track of it until you specifically de-allocate it.
      • Not doing so will crash the session/client/server.
      • It may not crash immediately. It may crash when the session, client or
        server closes.
• You cannot change the value of the handle:
      • Doing so will crash the session/client/server.

                                                                          Powered by
                   Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Coding Around Handles
• A really good way is to use a class
   – It performs the “open” part of the handle operation on the class
     constructor.
   – It performs the “close” part of the handle operation on the class
     destructor.
       • This means that no matter what happens, the handle operation
         will be properly closed even if this is not specifically coded in
         your LotusScript.
   – All the code specific to this handle operation is embedded in the
     class.
       • And can include multi-platform code.
   – All you see in your LotusScript is an operation with this specific
     class.

                                                                      Powered by
                  Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Handle Summary
• If you get a handle, you have to de-allocate it
• Only use handle data you know is valid
  – If a handle == NULLHANDLE (or ZERO), then its not
    a valid handle.
• Bonus:
  – NotesDocument.handle returns the current handle.
  – You can easily use LotusScript to:
     • find a document.
     • use direct calls to update information that the object model
       does not support (at the moment).
     • EG. Writing Notes Replica Items.                           Powered by
                Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Complex C API
• Where more than one function call is required to
  perform a function it is recommended that:
  – You use defensive coding techniques to understand and
    make “safe” every single coding branch possible.
  – Any handle information used during this sequence is
    kept safe and its de-allocation specifically catered for.
  – You use classes to ensure proper construction and
    destruction of handle information.



                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
What We’ll cover …
•   Introduction
•   Architectures
•   The LotusScript eXtension toolkit
•   Platform differences
•   Calling simple Notes C API
•   Complex Notes C API
•   Pros and cons


                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Know your battleground
• LotusScript coding is:
  – Fairly straightforward.
  – Supported.
  – Platform independent.
• Stepping outside of this comfort zone is going to be
  hard.
  – Take far more time in development and testing.
  – Push development resources to the limit.
  – Only do this if you have an absolute business need.

                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
LSX versus Notes C API
• You need to establish, based on your requirements, which is the best fit:


                                                   LS calling Notes C-
 Feature              LSX                          API directory
                      Requires code                No Deployment
 Deployment           deployment                   required
                      Different LSX for each
 Multi-platform       platform                     Same code in Library
                   Very good integration –
 C-API integration callbacks, etc                  Basic integration
 Code Difficulty      Medium                       Hard
 Stability            Extremely Stable             Stable

                                                                       Powered by
                  Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Resources
• Notes C API Reference, LSX Toolkit.
  – http://www-
    128.ibm.com/developerworks/lotus/downloads/toolkits.html
• NSFTools.com.
  – Lotus Notes API tips.
  – http://www.nsftools.com/tips/APITips.htm.




                                                                  Powered by
              Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Resources
• And now for some good news:
• ls2Capi
   – A book by Normunds Kalnberzin.
       • Software Specialist, IBM
         Switzerland.
   – The ultimate reference!
   – Ebook for €18, Book + shipping
     for €42.
   – It pays for itself in a single hour.
   – http://www.ls2capi.com



                                                                      Powered by
                  Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Summary
• Calling Notes C API is hard.
  – It has to be tested on all platforms.
  – It can easily take out a client or server process.
  – Only use it if absolutely required.
  – Use defensive coding!
  – It’s the next stage beyond the well regulated
    LotusScript sandbox.
  – It might be simpler to use LSX than Direct LotusScript
    to C API calls.
     • You certainly get more control and debugging.
  – It gives you all possible notes capability
                                                                   Powered by
               Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
Questions and Answers ?
• Bill.Buchan@hadsl.com – http://www.hadsl.com
• Personal Blog: http://www.billbuchan.com




                                                               Powered by
           Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow

More Related Content

What's hot

.NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016).NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016)citizenmatt
 
The security professional's guide to programming - Eric Vanderburg
The security professional's guide to programming - Eric VanderburgThe security professional's guide to programming - Eric Vanderburg
The security professional's guide to programming - Eric VanderburgEric Vanderburg
 
QBASIC
QBASICQBASIC
QBASICnivi88
 
Os Paesdosreistutorial
Os PaesdosreistutorialOs Paesdosreistutorial
Os Paesdosreistutorialoscon2007
 
Scala services in action
Scala services in actionScala services in action
Scala services in actionUnderscore
 
Object Oriented Programming I
Object Oriented Programming IObject Oriented Programming I
Object Oriented Programming Iraven_rainagi
 
Os Grossupdated
Os GrossupdatedOs Grossupdated
Os Grossupdatedoscon2007
 
Delphi Prism for iPhone/iPad and Linux with Mono and Monotouch
Delphi Prism for iPhone/iPad and Linux with Mono and MonotouchDelphi Prism for iPhone/iPad and Linux with Mono and Monotouch
Delphi Prism for iPhone/iPad and Linux with Mono and MonotouchAndreano Lanusse
 
It's a Jungle Out There – IoT and MRuby
It's a Jungle Out There – IoT and MRubyIt's a Jungle Out There – IoT and MRuby
It's a Jungle Out There – IoT and MRubymatustomlein
 
mRuby - Powerful Software for Embedded System Development
mRuby - Powerful Software for Embedded System DevelopmentmRuby - Powerful Software for Embedded System Development
mRuby - Powerful Software for Embedded System DevelopmentKazuhiro Koga 古賀一博
 

What's hot (12)

Get the Gist: .NET
Get the Gist: .NETGet the Gist: .NET
Get the Gist: .NET
 
.NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016).NET Core Blimey! (dotnetsheff Jan 2016)
.NET Core Blimey! (dotnetsheff Jan 2016)
 
The security professional's guide to programming - Eric Vanderburg
The security professional's guide to programming - Eric VanderburgThe security professional's guide to programming - Eric Vanderburg
The security professional's guide to programming - Eric Vanderburg
 
QBASIC
QBASICQBASIC
QBASIC
 
Os Paesdosreistutorial
Os PaesdosreistutorialOs Paesdosreistutorial
Os Paesdosreistutorial
 
Scala services in action
Scala services in actionScala services in action
Scala services in action
 
Object Oriented Programming I
Object Oriented Programming IObject Oriented Programming I
Object Oriented Programming I
 
Os Grossupdated
Os GrossupdatedOs Grossupdated
Os Grossupdated
 
Delphi Prism for iPhone/iPad and Linux with Mono and Monotouch
Delphi Prism for iPhone/iPad and Linux with Mono and MonotouchDelphi Prism for iPhone/iPad and Linux with Mono and Monotouch
Delphi Prism for iPhone/iPad and Linux with Mono and Monotouch
 
Dot net
Dot netDot net
Dot net
 
It's a Jungle Out There – IoT and MRuby
It's a Jungle Out There – IoT and MRubyIt's a Jungle Out There – IoT and MRuby
It's a Jungle Out There – IoT and MRuby
 
mRuby - Powerful Software for Embedded System Development
mRuby - Powerful Software for Embedded System DevelopmentmRuby - Powerful Software for Embedded System Development
mRuby - Powerful Software for Embedded System Development
 

Similar to Entwicker camp2007 calling-the-c-api-from-lotusscript

Entwicker camp2007 calling-the-c-api-from-lotusscript
Entwicker camp2007 calling-the-c-api-from-lotusscriptEntwicker camp2007 calling-the-c-api-from-lotusscript
Entwicker camp2007 calling-the-c-api-from-lotusscriptBill Buchan
 
Vienna buchan calling the notes c-api from lotus_script
Vienna buchan calling the notes c-api from lotus_scriptVienna buchan calling the notes c-api from lotus_script
Vienna buchan calling the notes c-api from lotus_scriptBill Buchan
 
Dev buchan leveraging the notes c api
Dev buchan leveraging the notes c apiDev buchan leveraging the notes c api
Dev buchan leveraging the notes c apiBill Buchan
 
Uklug2011.lotus.on.linux.report.technical.edition.v1.0
Uklug2011.lotus.on.linux.report.technical.edition.v1.0Uklug2011.lotus.on.linux.report.technical.edition.v1.0
Uklug2011.lotus.on.linux.report.technical.edition.v1.0dominion
 
An Introduction to the Model-View-Controller Pattern
An Introduction to the Model-View-Controller PatternAn Introduction to the Model-View-Controller Pattern
An Introduction to the Model-View-Controller PatternTeamstudio
 
AD303 - Extreme Makeover: IBM Lotus Domino Application Edition
AD303 - Extreme Makeover: IBM Lotus Domino Application EditionAD303 - Extreme Makeover: IBM Lotus Domino Application Edition
AD303 - Extreme Makeover: IBM Lotus Domino Application EditionRay Bilyk
 
AWS Summit Auckland - Moving MS .NET Applications One Container at a Time
AWS Summit Auckland - Moving MS .NET Applications One Container at a TimeAWS Summit Auckland - Moving MS .NET Applications One Container at a Time
AWS Summit Auckland - Moving MS .NET Applications One Container at a TimeAmazon Web Services
 
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis ZWorkshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Zpanagenda
 
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...John Head
 
OpenShift with Eclipse Tooling - EclipseCon 2012
OpenShift with Eclipse Tooling - EclipseCon 2012OpenShift with Eclipse Tooling - EclipseCon 2012
OpenShift with Eclipse Tooling - EclipseCon 2012Steven Pousty
 
Moving microsoft .net applications one container at a time
 Moving microsoft .net applications one container at a time  Moving microsoft .net applications one container at a time
Moving microsoft .net applications one container at a time Amazon Web Services
 
Free Mongo on OpenShift
Free Mongo on OpenShiftFree Mongo on OpenShift
Free Mongo on OpenShiftSteven Pousty
 
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...John Head
 
Ria Applications And PHP
Ria Applications And PHPRia Applications And PHP
Ria Applications And PHPJohn Coggeshall
 
BP214 IBM Lotus Symphony : Finally, A Developer's Friend
BP214 IBM Lotus Symphony : Finally, A Developer's FriendBP214 IBM Lotus Symphony : Finally, A Developer's Friend
BP214 IBM Lotus Symphony : Finally, A Developer's FriendJohn Head
 
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...John Head
 

Similar to Entwicker camp2007 calling-the-c-api-from-lotusscript (20)

Entwicker camp2007 calling-the-c-api-from-lotusscript
Entwicker camp2007 calling-the-c-api-from-lotusscriptEntwicker camp2007 calling-the-c-api-from-lotusscript
Entwicker camp2007 calling-the-c-api-from-lotusscript
 
Vienna buchan calling the notes c-api from lotus_script
Vienna buchan calling the notes c-api from lotus_scriptVienna buchan calling the notes c-api from lotus_script
Vienna buchan calling the notes c-api from lotus_script
 
Dev buchan leveraging the notes c api
Dev buchan leveraging the notes c apiDev buchan leveraging the notes c api
Dev buchan leveraging the notes c api
 
Uklug2011.lotus.on.linux.report.technical.edition.v1.0
Uklug2011.lotus.on.linux.report.technical.edition.v1.0Uklug2011.lotus.on.linux.report.technical.edition.v1.0
Uklug2011.lotus.on.linux.report.technical.edition.v1.0
 
Mini .net conf 2020
Mini .net conf 2020Mini .net conf 2020
Mini .net conf 2020
 
An Introduction to the Model-View-Controller Pattern
An Introduction to the Model-View-Controller PatternAn Introduction to the Model-View-Controller Pattern
An Introduction to the Model-View-Controller Pattern
 
AD303 - Extreme Makeover: IBM Lotus Domino Application Edition
AD303 - Extreme Makeover: IBM Lotus Domino Application EditionAD303 - Extreme Makeover: IBM Lotus Domino Application Edition
AD303 - Extreme Makeover: IBM Lotus Domino Application Edition
 
AWS Summit Auckland - Moving MS .NET Applications One Container at a Time
AWS Summit Auckland - Moving MS .NET Applications One Container at a TimeAWS Summit Auckland - Moving MS .NET Applications One Container at a Time
AWS Summit Auckland - Moving MS .NET Applications One Container at a Time
 
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis ZWorkshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
Workshop: HCL Notes 14 Upgrades einfach gemacht – von A bis Z
 
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...
BP218 IBM Lotus Notes 8 and IBM Lotus Expeditor Customization for LotusScript...
 
OpenShift with Eclipse Tooling - EclipseCon 2012
OpenShift with Eclipse Tooling - EclipseCon 2012OpenShift with Eclipse Tooling - EclipseCon 2012
OpenShift with Eclipse Tooling - EclipseCon 2012
 
C#: Past, Present and Future
C#: Past, Present and FutureC#: Past, Present and Future
C#: Past, Present and Future
 
Moving microsoft .net applications one container at a time
 Moving microsoft .net applications one container at a time  Moving microsoft .net applications one container at a time
Moving microsoft .net applications one container at a time
 
Free Mongo on OpenShift
Free Mongo on OpenShiftFree Mongo on OpenShift
Free Mongo on OpenShift
 
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...
IamLUG 2011: The Never Ending Integration Story: How to Integrate Your Lotus ...
 
Ria Applications And PHP
Ria Applications And PHPRia Applications And PHP
Ria Applications And PHP
 
BP214 IBM Lotus Symphony : Finally, A Developer's Friend
BP214 IBM Lotus Symphony : Finally, A Developer's FriendBP214 IBM Lotus Symphony : Finally, A Developer's Friend
BP214 IBM Lotus Symphony : Finally, A Developer's Friend
 
Php on Windows
Php on WindowsPhp on Windows
Php on Windows
 
.Net without spending a buck
.Net without spending a buck.Net without spending a buck
.Net without spending a buck
 
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...
JMP106 “Kum Bah Yah” Meets “Lets Kick Butt” : The Integration of IBM Lotus No...
 

More from Bill Buchan

Dummies guide to WISPS
Dummies guide to WISPSDummies guide to WISPS
Dummies guide to WISPSBill Buchan
 
WISP for Dummies
WISP for DummiesWISP for Dummies
WISP for DummiesBill Buchan
 
WISP Worst Practices
WISP Worst PracticesWISP Worst Practices
WISP Worst PracticesBill Buchan
 
Marykirk raft race presentation night 2014
Marykirk raft race presentation night 2014Marykirk raft race presentation night 2014
Marykirk raft race presentation night 2014Bill Buchan
 
Dev buchan best practices
Dev buchan best practicesDev buchan best practices
Dev buchan best practicesBill Buchan
 
Dev buchan leveraging
Dev buchan leveragingDev buchan leveraging
Dev buchan leveragingBill Buchan
 
Dev buchan everything you need to know about agent design
Dev buchan everything you need to know about agent designDev buchan everything you need to know about agent design
Dev buchan everything you need to know about agent designBill Buchan
 
Dev buchan 30 proven tips
Dev buchan 30 proven tipsDev buchan 30 proven tips
Dev buchan 30 proven tipsBill Buchan
 
Entwicker camp2007 blackberry-workshop
Entwicker camp2007 blackberry-workshopEntwicker camp2007 blackberry-workshop
Entwicker camp2007 blackberry-workshopBill Buchan
 
Admin2012 buchan web_services-v101
Admin2012 buchan web_services-v101Admin2012 buchan web_services-v101
Admin2012 buchan web_services-v101Bill Buchan
 
Reporting on your domino environment v1
Reporting on your domino environment v1Reporting on your domino environment v1
Reporting on your domino environment v1Bill Buchan
 
12 Step Guide to Lotuscript
12 Step Guide to Lotuscript12 Step Guide to Lotuscript
12 Step Guide to LotuscriptBill Buchan
 
Everything you ever wanted to know about lotus script
Everything you ever wanted to know about lotus scriptEverything you ever wanted to know about lotus script
Everything you ever wanted to know about lotus scriptBill Buchan
 
Admin camp 2011-domino-sso-with-ad
Admin camp 2011-domino-sso-with-adAdmin camp 2011-domino-sso-with-ad
Admin camp 2011-domino-sso-with-adBill Buchan
 
Softsphere 08 web services bootcamp
Softsphere 08 web services bootcampSoftsphere 08 web services bootcamp
Softsphere 08 web services bootcampBill Buchan
 
Connections Lotusphere Worst Practices 2013
Connections Lotusphere Worst Practices 2013Connections Lotusphere Worst Practices 2013
Connections Lotusphere Worst Practices 2013Bill Buchan
 
Lotusphere 2009 The 11 Commandments
Lotusphere 2009 The 11 CommandmentsLotusphere 2009 The 11 Commandments
Lotusphere 2009 The 11 CommandmentsBill Buchan
 

More from Bill Buchan (20)

Dummies guide to WISPS
Dummies guide to WISPSDummies guide to WISPS
Dummies guide to WISPS
 
WISP for Dummies
WISP for DummiesWISP for Dummies
WISP for Dummies
 
WISP Worst Practices
WISP Worst PracticesWISP Worst Practices
WISP Worst Practices
 
Marykirk raft race presentation night 2014
Marykirk raft race presentation night 2014Marykirk raft race presentation night 2014
Marykirk raft race presentation night 2014
 
Dev buchan best practices
Dev buchan best practicesDev buchan best practices
Dev buchan best practices
 
Dev buchan leveraging
Dev buchan leveragingDev buchan leveraging
Dev buchan leveraging
 
Dev buchan everything you need to know about agent design
Dev buchan everything you need to know about agent designDev buchan everything you need to know about agent design
Dev buchan everything you need to know about agent design
 
Dev buchan 30 proven tips
Dev buchan 30 proven tipsDev buchan 30 proven tips
Dev buchan 30 proven tips
 
Entwicker camp2007 blackberry-workshop
Entwicker camp2007 blackberry-workshopEntwicker camp2007 blackberry-workshop
Entwicker camp2007 blackberry-workshop
 
Bp301
Bp301Bp301
Bp301
 
Ad507
Ad507Ad507
Ad507
 
Ad505 dev blast
Ad505 dev blastAd505 dev blast
Ad505 dev blast
 
Admin2012 buchan web_services-v101
Admin2012 buchan web_services-v101Admin2012 buchan web_services-v101
Admin2012 buchan web_services-v101
 
Reporting on your domino environment v1
Reporting on your domino environment v1Reporting on your domino environment v1
Reporting on your domino environment v1
 
12 Step Guide to Lotuscript
12 Step Guide to Lotuscript12 Step Guide to Lotuscript
12 Step Guide to Lotuscript
 
Everything you ever wanted to know about lotus script
Everything you ever wanted to know about lotus scriptEverything you ever wanted to know about lotus script
Everything you ever wanted to know about lotus script
 
Admin camp 2011-domino-sso-with-ad
Admin camp 2011-domino-sso-with-adAdmin camp 2011-domino-sso-with-ad
Admin camp 2011-domino-sso-with-ad
 
Softsphere 08 web services bootcamp
Softsphere 08 web services bootcampSoftsphere 08 web services bootcamp
Softsphere 08 web services bootcamp
 
Connections Lotusphere Worst Practices 2013
Connections Lotusphere Worst Practices 2013Connections Lotusphere Worst Practices 2013
Connections Lotusphere Worst Practices 2013
 
Lotusphere 2009 The 11 Commandments
Lotusphere 2009 The 11 CommandmentsLotusphere 2009 The 11 Commandments
Lotusphere 2009 The 11 Commandments
 

Entwicker camp2007 calling-the-c-api-from-lotusscript

  • 1. Calling the Notes C API from LotusScript Bill Buchan Director, HADSL Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 2. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 3. Target and Purpose • Who is the target audience? – Advanced Lotus Notes Developers. – Developers who have a little experience in the C API. • What is this about? – This talk aims to demonstrate advanced LotusScript, showing: • The Notes C API interface. • The LSX interface. • Pros and cons of each. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 4. Notes C API • Why Notes C API? – 900+ Supported Methods. – Many complex tasks can be called via API. • Who am I? – Bill Buchan. – Dual PCLP in v3, v4, v5, v6, v7. – CEO of HADSL—developing best-practice tools. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 5. Notes C API Programming Toolkit • Where can you find information on the C API? – The Lotus Notes C Programming toolkit. • The toolkit contains: – Contains two documentation databases. – Each function and structure is documented. – A large number of sample C programs are included. – Compile time libraries for all platforms. • Generally speaking backward compatibility is good: – For instance, if you have v6 and v7 servers, creating the program using v6 of the API toolkit means that it will run on v6 and v7 servers. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 6. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 7. Notes/Domino Architectures • Domino is a multi-platform server product. • Notes now supports four clients: – Windows, Mac (Power PC), Mac (Intel), Linux. • LotusScript supported from v4.x of Notes. – Rich set of APIs for general business logic. – Robust, supported environment. – Amazing level of multi-platform support. • What if you want to go further? – Exploit a piece of Notes C API interface? – Call a platform specific DLL? Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 8. But Surely • Currently, something like: – 90% of all Domino servers run on Windows. – 95% of all Notes clients run on Windows. • Why not write platform code for that and that alone? – A short sighted decision. Your environment will change. – Windows 64-bit coming over the horizon. • Treat it as a separate platform - as was 16-bit Windows. • Corporate push to centralize and consolidate. – Especially on medium-high level platforms. • Linux, Solaris, AIX, HP/UX. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 9. Be Pragmatic—The Skills Triangle Few Code Examples Harder, Expensive C-API LotusScript, Java Easier, Many Code Examples Cheaper Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 10. Be Pragmatic • Call the Notes C API from LotusScript if: – You cannot find a supported architectural solution. – You have the skills to support LSX and/or Notes C API coding. – You might possibly require multi-platform code. – You accept that this code will be harder to write, harder to maintain, and harder to support. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 11. Architectures—Conclusion • If you have to step outside the comfort zone, you have two choices: – LotusScript eXtension Toolkit—LSX. • This builds a library—on windows, a DLL—which allows you to extend LotusScript with custom C code. • Fairly straightforward. • A different version for each platform. – LotusScript calling the Notes C API interface directly. • Not straightforward. • One code base can cover all platforms. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 12. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 13. What is the LSX Toolkit? • A C-based API for Lotus Notes. – Interfaces with LotusScript. – Allows you to build platform-specific libraries. – Pros: • Straightforward for a competent C Programmer. – Cons: • Platform—and sometimes version(!)—specific. – You have to produce a version for each platform. • Lack of support. – Last release – March 2001. – Visual Studio 2005 not supported. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 14. What is the LSX Toolkit good for? • Used to use it for Notes Database work. – We have a Notes Database installer which unpacks, design refreshes, sets ACLs, etc. – Initially coded that as LSX. – Now use LotusScript calls to Notes C API directly. • Deployment of LSXs is non-trivial. • Especially updating LSXs that are in use! • Still use it for Active Directory Integration. – AD integration possible using LotusScript/COM interface – but unreliable. – Code ADSI to manage objects within AD Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 15. How can you create an LSX? • Design a data structure you wish to expose in LotusScript. • Use the LSX Wizard to create a relevant LSX project. • Use a supported C-Compiler for your platform(s) to create code to fill in the blanks. • Run Do_It to compile your library. – Windows produces a .DLL file. – *nix produces a .so file. • Place that library in the executable code directory of your server and/or client. • Test, test, test! Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 16. LSX Wizard (1) • Create a new Project. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 17. LSX Wizard (2) • Now add a class to the project. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 18. LSX Wizard (3) • Override the Constructor. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 19. LSX Wizard (4) • Add a “Close” Sub. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 20. LSX Wizard (5) • Add a Getter and Setter. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 21. LSX Wizard (6) • You should now see this: Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 22. LSX Wizard (7) • Now generate code. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 23. LSX Wizard (8) • Now fill in the code in the LSX source files. //{{LSX_AUTHOR_CODE_Include_1 //}} #include "DbReplicaFlags.hpp" // includes for the objects defined in your LSX //{{LSX_AUTHOR_CODE_Include_2 //}} Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 24. LSX Wizard (9) • Now fill in the code in the LSX source files. DbReplicaFlags:: DbReplicaFlags( LSPTR(LSXLsiSession) pContainer, LSXString& Server, LSXString& Database) : LSXBase((LSPLTSTR)"DbReplicaFlags", pContainer- >LSXGetInstance(), CDBREPLICAFLAGS_DBREPLICAFLAGS_ID, pContainer) //{{LSX_AUTHOR_CODE_Additional_Base_Class_Init1 //}} //{{LSX_AUTHOR_CODE_Internal_Member_Init1 //}} { //{{LSX_AUTHOR_CODE_Constructor1 //}} } Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 25. LSX Wizard (10) • Run a command prompt. – Go to the LSX directory. – Run LSXSetup W32. – Run cd DbReplicaFlags. – Run Do_it. • This will compile the DLL file. – Copy the DLL from lsxbinw32DbReplicaFlags.dll to your Notes Program Directory. • Note: – The Notes client (or server) usually holds onto the DLL once loaded, so refreshing the LSX usually requires a client (or server) restart. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 26. LSX Wizard (11) • Create a LotusScript Agent: Uselsx “DbReplicaFlags.dll” ' in 'Options' Sub Initialize Dim DR As New DbReplicaFlags("", "names.nsf") Dim value As Integer If dr.GetDbReplicaFlag(REPLFLG_DISABLE, value) Then If (value) Then Print "Replica Disable is set to 'TRUE'" Else Print "Replica Disable is set to 'False'" End If Else Print "I failed to get the replica flag " End If Call dr.NSFDbClose() End Sub Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 27. LSX Wizard (12) • As a side effect of loading the LSX. – The LSX signature is now available in the designer. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 28. LSX Summary • LSX Toolkit is fairly straightforward. • Since the LSX Toolkit supports multiple platforms and the same source code is used on each: – You do have to recompile the LSX on multiple platforms. – You don’t have to take account of many platform differences. • It’s good for extending your code to new APIs. – EG: You can call Active Directory API calls in order to integrate Domino with Active Directory Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 29. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 30. Platform Differences: Definitions • In normal LotusScript, platform differences are taken care of. – Even in LSX programming most differences are taken care of. – Not so in direct LotusScript to C API calls. • Each platform represents data in a subtly different manner. – For instance, the HANDLE datatype has different lengths on different platforms: • 32 bits long in Windows and OS/400. • 16 bits long on AIX, Macintosh, etc. – Memory alignment widths on iSeries are different from other platforms. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 31. Platform Specific implementations • In order to call the Notes library, you will have to link to different library files on each platform: – Windows/32: nnotes.dll – Solaris, Linux: libnotes.so – AIX: lnotes_r.a – HPUX: libnotes.sl – MacOs, OS/X: NotesLib – OS/400: libnotes.srvpgm – OS/390 libnotes – OS/2: lnotes.dll Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 32. Platform Differences: Endians • Endians: – Some platforms represent multi-byte numbers numbers with the lowest value bytes in the lower segments of memory—little endians. – Macintosh (on PowerPC!) represents the larger value bytes in the lower segments of memory—big endians. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 33. Coding for platform differences • Our challenge is to construct a code sequence that: – Knows which platform it’s running on. – Makes calls to the platform-specific library file. – Understands platform differences in terms of alignment and data item size. – And most importantly—fails “safe” when presented with a new platform that it cannot deal with. • This is not a trivial exercise. – My estimate is that this exercise will take at least 5-10 times more effort—development + testing—than a normal LotusScript business function. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 34. Decoding Signatures • A “Signature” is: – The definition of a function calls' parameters and return value. – These are found in the Notes “C API 7.0 Reference”: • Example signature: STATUS LNPUBLIC NSFNoteLSCompile( DBHANDLE hDb, NOTEHANDLE hNote, DWORD dwFlags); • In Windows: Declare Function W32_NSFLSCompile Lib LIB_W32 Alias "NSFNoteLSCompile" ByVal hdb As Long, ByVal hNote As Long, ByVal null1 As Long ) As Integer Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 35. Decoding Signatures (cont.) C-API W in32 Linux AIX Solaris Mac BYTE BYTE BYTE BYTE BYTE BYTE BOOL Long Long Long Long Integer Int Long Long Long Long Long Long Int Long Long Long Long Long WORD Integer Integer Integer Integer Integer SWORD Integer Integer Integer Integer Integer DWORD Long Long Long Long Long LONG Int Long Long Long Long Long HANDLE Long Integer Integer Integer Integer NOTEHANDLE Long Integer Integer Integer Integer DBHANDLE Long Integer Integer Integer Integer MEMHANDLE Long Long Long Long Long STATUS Integer Integer Integer Integer Integer Char * String String String String String Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 36. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 37. Calling a simple C API function • Let’s get our feet wet with some simple API. – No complex sequence of calls handling a shared memory resource - A single call with simple datatypes. – A call that will not result in client memory corruption should we get it wrong. Hopefully. • Let’s call it from Windows and ignore other platforms. – A function that tells you the network latency—in milliseconds— between the current Notes instance and a target server: • NSFGetServerLatency Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 38. NSFGetServerLatency() • We shall call: – NSFGetServerLatency(). – Returns the network latency time (in ms) to a remote server. – Shows which server is closest in terms of network respose. – Its signature from the C API reference is: STATUS LNPUBLIC NSFGetServerLatency( char far *ServerName, DWORD Timeout, DWORD far *retClientToServerMS, DWORD far *retServerToClientMS, WORD far *ServerVersion); Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 39. NSFGetServerLatency() • From the C API Reference: Input Parameters ServerName—Null-terminated string containing the name of the server to query. Timeout—Number of milliseconds to wait for a reply from the server. A timeout of 0 indicates that the default timeout value is to be used. Output Parameters (routine) - Return status from this call: NOERROR - Success retClientToServerMS - Optional - If not NULL, the number of milliseconds required to send the request to the server is stored at this address. retServerToClientMS - Optional - If not NULL, the number of milliseconds required for the reply to return from the server is stored at this address. ServerVersion - Optional - If not NULL, the server version (the Domino build number for the server) is stored at this address. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 40. Simple C API Calling: ' This is a constant for our windows-based ' Library file: Const LIB_W32 = "nnotes.dll" ' Declare our function for windows Declare Function W32_NSFGetServerLatency _ Lib LIB_W32 Alias {NSFGetServerLatency} (_ Byval ServerName As Lmbcs String, _ Byval Timeout As Long, _ retClientToServerMS As Long, _ retServerToClientMS As Long, _ ServerVersion As Integer) As Integer Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 41. Simple C API Calling: Execution ' A function to get network latency time... Public Function getServerLatency _ (strServer As String) As Long Dim nnServer As New NotesName(strServer) Dim ToServer As Long, fromServer As Long Dim ver As Integer Dim timeout As Long timeout = 1000 ' 1000ms == 1 second Call W32_NSFGetServerLatency(nnServer.Canonical,_ timeout, toServer, fromServer, ver) ' Return both directional latencies added together getServerLatency = fromServer + ToServer End Function Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 42. Simple C API Calling: Execution Sub initialise Print “Calling function” Print “Latency is: “ + _ cstr(getServerLatency(“domino- 90.hadsl.com/HADSL/US”)) Print “Finished calling” end sub Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 43. Simple C API Calling: The Results • Running the agent “Example1” in the database produces the following runtime output: • Now—this is not production code! It requires: – Error handling. – Multi-platform support. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 44. What Can’t You Call? • Callback routines – Some Notes C API functions require you to specify mandatory callback routines—other pieces of C API that will get called by the target C API routine. • LotusScript does not (and IMHO never will) support this. • This rules out Extension Manager Routines, Menu Addin Routines. – In terms of callback routines that allow you to specify optional callbacks (progress status indicators, etc), you can pass in NULL (or ZERO), and the callback function will be ignored. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 45. What We’ll Cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 46. Defining complex C API • Complex C API is where: – More than one function call is required to perform a task. • and/or – A HANDLE of some description is needed to reference a data object. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 47. API handles • A handle is a numeric reference to a structure in memory that the C API interface has created. – For example, a handle to a Notes Database. • You do not deal with the memory structure itself— you deal with the handle to the memory structure. – Example: NSFDbOpen() creates a new memory structure and gives you back the handle to that. – You perform some work using NSFDInfoGet() – You close the database using NSFDbClose(). Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 48. Some Rules on handles • There are different types of handles: – Document handle, database handle, etc. – Do not mix these handles up! • Doing so will crash the session/client/server. • Always properly close your handles: – You have to properly trap all code branches. – You have to keep track of it until you specifically de-allocate it. • Not doing so will crash the session/client/server. • It may not crash immediately. It may crash when the session, client or server closes. • You cannot change the value of the handle: • Doing so will crash the session/client/server. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 49. Coding Around Handles • A really good way is to use a class – It performs the “open” part of the handle operation on the class constructor. – It performs the “close” part of the handle operation on the class destructor. • This means that no matter what happens, the handle operation will be properly closed even if this is not specifically coded in your LotusScript. – All the code specific to this handle operation is embedded in the class. • And can include multi-platform code. – All you see in your LotusScript is an operation with this specific class. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 50. Handle Summary • If you get a handle, you have to de-allocate it • Only use handle data you know is valid – If a handle == NULLHANDLE (or ZERO), then its not a valid handle. • Bonus: – NotesDocument.handle returns the current handle. – You can easily use LotusScript to: • find a document. • use direct calls to update information that the object model does not support (at the moment). • EG. Writing Notes Replica Items. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 51. Complex C API • Where more than one function call is required to perform a function it is recommended that: – You use defensive coding techniques to understand and make “safe” every single coding branch possible. – Any handle information used during this sequence is kept safe and its de-allocation specifically catered for. – You use classes to ensure proper construction and destruction of handle information. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 52. What We’ll cover … • Introduction • Architectures • The LotusScript eXtension toolkit • Platform differences • Calling simple Notes C API • Complex Notes C API • Pros and cons Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 53. Know your battleground • LotusScript coding is: – Fairly straightforward. – Supported. – Platform independent. • Stepping outside of this comfort zone is going to be hard. – Take far more time in development and testing. – Push development resources to the limit. – Only do this if you have an absolute business need. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 54. LSX versus Notes C API • You need to establish, based on your requirements, which is the best fit: LS calling Notes C- Feature LSX API directory Requires code No Deployment Deployment deployment required Different LSX for each Multi-platform platform Same code in Library Very good integration – C-API integration callbacks, etc Basic integration Code Difficulty Medium Hard Stability Extremely Stable Stable Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 55. Resources • Notes C API Reference, LSX Toolkit. – http://www- 128.ibm.com/developerworks/lotus/downloads/toolkits.html • NSFTools.com. – Lotus Notes API tips. – http://www.nsftools.com/tips/APITips.htm. Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 56. Resources • And now for some good news: • ls2Capi – A book by Normunds Kalnberzin. • Software Specialist, IBM Switzerland. – The ultimate reference! – Ebook for €18, Book + shipping for €42. – It pays for itself in a single hour. – http://www.ls2capi.com Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 57. Summary • Calling Notes C API is hard. – It has to be tested on all platforms. – It can easily take out a client or server process. – Only use it if absolutely required. – Use defensive coding! – It’s the next stage beyond the well regulated LotusScript sandbox. – It might be simpler to use LSX than Direct LotusScript to C API calls. • You certainly get more control and debugging. – It gives you all possible notes capability Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow
  • 58. Questions and Answers ? • Bill.Buchan@hadsl.com – http://www.hadsl.com • Personal Blog: http://www.billbuchan.com Powered by Den nächste Schritt zum Erfolg : Domino&Notes 8Bundled-KnowHow