CryExtension Samples

Sample 1 - Implementing a source control plugin via extensions

//////////////////////////////////////////////////////////////////////////
// source control interface

struct ISourceControl : public ICryUnknown
{
  CRYINTERFACE_DECLARE(ISourceControl, 0x399d8fc1d94044cc, 0xa70d2b4e58921453)

  virtual void GetLatest(const char* filename) = 0;
  virtual void Submit() = 0;
};

typedef cryshared_ptr<ISourceControl> ISourceControlPtr;

//////////////////////////////////////////////////////////////////////////
// concrete implementations of source control interface

class CSourceControl_Perforce : public ISourceControl
{
  CRYINTERFACE_BEGIN()
    CRYINTERFACE_ADD(ISourceControl)
  CRYINTERFACE_END()

  CRYGENERATE_SINGLETONCLASS(CSourceControl_Perforce, "CSourceControl_Perforce", 0x7305bff20ee543e3, 0x820792c56e74ecda)

  virtual void GetLatest(const char* filename) { ... };
  virtual void Submit() { ... };
};

CRYREGISTER_CLASS(CSourceControl_Perforce)


class CSourceControl_SourceSafe : public ISourceControl
{
  CRYINTERFACE_BEGIN()
    CRYINTERFACE_ADD(ISourceControl)
  CRYINTERFACE_END()

  CRYGENERATE_SINGLETONCLASS(CSourceControl_SourceSafe, "CSourceControl_SourceSafe", 0x1df62628db9d4bb2, 0x8164e418dd5b6691)

  virtual void GetLatest(const char* filename) { ... };
  virtual void Submit() { ... };
};

CRYREGISTER_CLASS(CSourceControl_SourceSafe)

//////////////////////////////////////////////////////////////////////////
// using the interface (submitting changes)

void Submit()
{
  ICryFactoryRegistry* pReg = gEnv->pSystem->GetFactoryRegistry();

  ICryFactory* pFactory = 0;
  size_t numFactories = 1;
  pReg->IterateFactories(cryiidof<ISourceControl>(), &pFactory, numFactories);

  if (pFactory)
  {
    ISourceControlPtr pSrcCtrl = cryinterface_cast<ISourceControl>(pFactory->CreateClassInstance());
    if (pSrcCtrl)
    {
      pSrcCtl->Submit();
    }
  }
}