Ebenezer Enterprises

We host a free code generator called the the C++ Middleware Writer (CMW). The CMW writes low-level C++ marshalling code based on user input.

Using the CMW in your build environment
Comparing Boost Serialization to our approach
Send Sample - sendsample.cc
Receive Sample - receivesample.cc
Rbtree Sample

Supported Types and Platforms
Provide Feedback
Company Overview
Links

A voice of reason in the Democratic Party?

Recent Developments

November, 2011

Version 1.13 of the CMW is on line. This version adds support for:

1. A lil_string class which throws an exception if an operation would result in a string more than 255 characters. This guarantees that the length of the string can be marshalled with one byte. Lil_string is used, for example, to hold account passwords.

2. Move semantics. A config file parameter, 'Permit-std::move', is used to indicate that the generated code may use std::move. The following shows an example of code generated when Permit-std::move is turned on.

template <typename B>
void
Receive(B* buf, vector<deque<lil_string> >& abt1)
{
  uint32_t headCount[2];
  buf->Give(headCount[0]);
  abt1.reserve(abt1.size() + headCount[0]);
  for (; headCount[0] > 0; --headCount[0]) { 
    deque<lil_string> rep4;
    buf->Give(headCount[1]);
    for (; headCount[1] > 0; --headCount[1]) { 
      lil_string rep5(buf);
      rep4.push_back(std::move(rep5));
    }
    abt1.push_back(std::move(rep4));
  }
}
October, 2010

Version 1.12 of the C++ Middleware Writer released.

April, 2010

Version 1.11 of the C++ Middleware Writer released.

November, 2009

Version 1.10 of the C++ Middleware Writer released.

August, 2009

Support for stable_vector added. Here's a modified version of stable_vector.hpp that compiles with gcc version 4.3.2.

May, 2009

Support for Boost Array is available.

July, 2009

February, 2009

March, 2008

Support for the Boost Unordered Containers library is available. This includes unordered_set, unordered_multiset, unordered_map and unordered_multimap.

Support for message lengths is now available. Code that receives messages should call SetMsgLength() (ReceiveBuffer::SetMsgLength or ReceiveCompressedBuffer::SetMsgLength) prior to calling a Receive function. See the Receive Sample for an example of this. A clc++m thread titled "Preventing Denial of Service Attack in IPC Serialization" was instrumental in the decision to add this support.

Support for the Boost Range library's sub_range<> is available. The support for this type is unusual in that it is possible to send data via a sub_range but not receive data into one. There's more info here about how we support this type.

January, 2008

Support for message IDs is now available.
This Middle code:

msgs
  @msg_id_a1 (list<int32_t>) 
}

results in this output. Notice how the Send function includes code to send a message ID, but the Receive function doesn't have any related code. The data from the Marshal function will probably be handled by two Receive functions. The first Receive function (not shown) to execute will get a message ID, which can then be used to dispatch to the Receive function in the above listing. This program shows an example of that.

June, 2006

Worked on improving the Middleware Service documentation including expanding the "Advantages" section and adding a section called "Dealing with Stragglers" that discusses supporting multiple versions of a product simultaneosly.

December, 2005

Added valarray<> support,
changed/improved the code generated when receiving vectors of POD,
changed/improved the code in Marshal functions after noting only a single int is needed to keep track of the counts/sizes of container classes. We still use an array of ints in Receive functions.

website monitoring