Implementing a PODSObjectSrc instance

Implement a PODSObjectSrc instance:

// Create our object source and fill in vtable
// entries for objectForName and destroy 
ObjectSrc *ObjectSrcNew(PODSObjectMgr *objectMgr)
{
   ObjectSrc *self = (ObjectSrc *)calloc(1, sizeof(ObjectSrc));

   self->vtable = (PODSObjectSrcVTable *)calloc(1, sizeof(PODSObjectSrcVTable));

   PODS_SET_METHOD(self->vtable, objectForName, ObjectSrcObjectForName);
   PODS_SET_METHOD(self->vtable, destroy, ObjectSrcDestroy);

   self->objectMgr = objectMgr;

   return self;
}

And register it with the PODSObjectMgr :

PODSregisterObjectSrc(objMgr, objSrc);

When JavaScript code calls the JavaScript avantgo.createObject() method, M-Business Client calls PODSObjectMgr's objectForName() method, which begins calling the objectForName() method of every PODSObjectSrc instance registered with PODSObjectMgr, passing the string that JavaScript passed to avantgo.createObject(). PODSObjectMgr stops calling registered objectForName() methods as soon as one successfully returns an object.

Each object source should handle the objectForName() method either by returning a PODS object to JavaScript or by returning NULL if the object source cannot return an object with the given name. An object source may handle the objectForName() method either by creating a completely new PODS object or by returning an existing object.

An object source may return the same object in response to many different calls to the objectForName() method, or it may create a new object for each call. In either case, it must arrange for the object to be freed correctly:

static PODSObject 
                       *ObjectSrcObjectForName(PODSObjectSrc 
                       *podsObjSrc, PODSString name)
{
   ObjectSrc *self = (ObjectSrc *)podsObjSrc;

   if (0 == strcmp(name, SAMPLE_NAME)) {
      if (!self->sampleObject)
         self->sampleObject = SampleObjectNew();

      return (PODSObject *)self->sampleObject;
   }

   return NULL;
}

The objectForName() method returns a PODSObject, so any object returned by the objectForName() method must, at the least, implement the methods defined by the PODSObject interface. Note that JavaScript code cannot invoke these methods directly. An object returned by the objectForName() method may implement additional interfaces if you need it to do so.

The code for the sample object below is from the sampleobjectsrc.c file from the ObjectSrc example. See ObjectSrc sample: vending objects to JavaScript.

SampleObject *SampleObjectNew()
{
   SampleObject *self = (SampleObject *)calloc(1, sizeof(SampleObject));

   self->vtable = (SampleObjectVTable *)calloc(1, sizeof(SampleObjectVTable));

   PODS_SET_METHOD(self->vtable, add, SampleObjectAdd);
   PODS_SET_METHOD((PODSObjectVTable *)self->vtable, destroy, SampleObjectDestroy);
   PODS_SET_METHOD((PODSObjectVTable *)self->vtable, getMethod, SampleObjectGetMethod);

   return self;
}

For guidelines on naming PODS objects, see Naming your PODS objects.