• Keyword arguments in Python don't seem to be making it across the interface.
    Intercepted by Python's error handling. Does Python support keywords in CDispatch?
  • User-level Converter mechanism.
    Usual one from the inter-system approach.
    Can kind of do it now using methods for createCOMObject. Just define a method for the particular type.
  • Static methods for a COM object.
    Use OOP to implement the COM definition.
  • DLLs need to be in your path or in the RDCOMServer directory.
    Could copy RDCOM.exe and RDCOMServer.dll to $R_HOME/bin/
  • Environment in which functions are evaluated.
    Or is this just specific to objects() using the environment of the function in which it is invoke?
  • Out of process server.
    Needed for distributed R computing.
    Basics working. Need to ensure it dies.

    Also, need to connect it to the CLSID. Easily done with a command line argument giving the CLSID to create the factory for.

  • Arrays.
    Basics in place.

    Lists, matrices, S-array objects.

    Collapse lists to homogeneous types (unlist).

  • [Out] values in methods
    Not really S-like.
  • Add-ins for visual basic and Excel.
  • Fixed

  • Support for different types of S COM definitions.
    OOP, S4, ...
    Users can do this by defining different dispatch methods.
  • Type information.
    See SWinTypeLibs
  • Events
    IConnectionPoint and similar interfaces. Check what Effective COM has to say on this topic - they recommend against it but because of efficiency, etc. Not a problem really for us!

    Allow S-COM classes to implement COM interfaces. Particularly, allow them to implement IConnectionPointConainer and become event sources.

    Allow extending classes with S functions/methods.
    Allow specification of the diffrent IIDs that an object responds to.

  • Map the errors in R to COM error codes in C++.
    Need to create the relevant enum list in R.
  • When registering, check the existence of another class with that CLSID...
  • Instantiation via persistent objects.
    I.e. {de,}serialize S objects in the COM way.

    Need methods for creating the C++-level COM object for certain types.

    See where we read the rda key in COMGetClassDef and in registerClassID( rda = ..)

  • Instantiation from local information in the registry for the CLSID.
    e.g. deserialize an S object, source a file, etc.

    Just have a piece of code in GetCOMClassDef that looks at the CLSID and queries the registry to find the definition.

  • Examples
    Visual Basic one basically works. Get Python, Java (okay), Perl (okay), VB(okay), C++ (VC++ and MinGW - see R/COMDispatchServer) examples.

    For Java, we might use JACOB or com.ms.com. See the tests/ directory and GNUmakefile.

  • Python is acting strangely wiht our servers
    Invokes methods rather without the parens () and hence cannot pass arguments. Possibly it is the way were are responding to GetIdsOfNames and the call type.
  • Conversion of complex objects.
    If get an object, then respond to any queries. Create an object which responds to any function requests and include this as the first argument and offers its attributes or elements as properties.
    See genericObject.S
  • Destructor functions
    Up to the SCOMIDispatch object to supply a 3rd function (along with invoke and getidsofnames).
  • Support properties.
    Getting and setting at the Invoke level and also at the S level.

    For now, write the get and set methods yourself. Otherwise, add a mechanism to SCOMEnvironmentClass converter which creates .{s,g}etProperty methods using the environment of the functions.

    Done at the S object level implementation.

  • GetIDsOfNames to handle cNames greater than 1, i.e. multiple names which will be argument names.
    Cacheing at the C++ level - at C-level or with a named S integer object.

    Done with the SCOMIDispatch at the S level.

  • Remove the need to get the factory separately.
    See client.exe example in COMIDispatchServer/. Change to GCC 3.2, not 2.95
  • S function to create the COM objects based on the class/type of the definition. (createCOMObject() function)
    Call this from the factory's CreateInstance method. Have it invoke a C method to create the object via a .Call() and return the pointer via an ExternalPtr.

    See RCOMFunctionFactory.

  • Set R_HOME from the registry.
    Get this either from the central part of the registry or put the value into each CLSID entry.