The Server Side Example for C++

#include "ltmm.h"
#include "ILMNetSnk2.h"


HRESULT AddNetTarget();
IltmmCapture *pCapture; 
void main()
{
   BSTR sUser; 
   BSTR sPassword; 
   long lIndex = 0; 
   BSTR szFileName; 
   long lOldConversion; 
   long lConversion; 
   long lCount = 0;
 
   CoInitialize(NULL); 
   HRESULT hr = CoCreateInstance(CLSID_ltmmCapture, NULL, CLSCTX_INPROC_SERVER, IID_IltmmCapture, (void**) &pCapture); 
   if(FAILED(hr)) 
   {
      //AfxMessageBox("Can't instantiate capture library");
      return; 
   }
   AddNetTarget();
   pCapture->EditGraph();

   IUnknown* pUnk = NULL; 
   
   pCapture->GetSubObject (ltmmCapture_Object_Sink, &pUnk); 
   if(pUnk) 
   {
      ILMNetSnk* pSnk = NULL; 
      pUnk->QueryInterface(IID_ILMNetSnk, (void**) &pSnk); 
      pUnk->Release();
      if(pSnk) 
      {
          VARIANT_BOOL vbBool; 
          pSnk ->get_RequireLogin (& vbBool); 
         //Require login with user name and password from the client. 
         pSnk->put_RequireLogin (VARIANT_TRUE); 
         //Get The current connection version. 
         pSnk->get_ConnectionVersion (&lOldConversion); 
         sUser     = SysAllocString(L"User1");
         sPassword = SysAllocString(L"P12345");
         // add User1 to the server with the password "P12345"
         pSnk->AddUser (sUser, sPassword, &lIndex); 
         // Free the user name and the password
         SysFreeString(sUser); 
         SysFreeString(sPassword); 
         pSnk->get_ConnectionVersion (&lConversion); 
         if(lConversion != lOldConversion) 
         {
            // the version number is updated after adding User1
         }
         sUser     = SysAllocString(L"User2");
         sPassword = SysAllocString(L"ABC123");
         // add User2 to the server with the password "ABC123"
         pSnk->AddUser (sUser, sPassword, &lIndex); 

         // Free the user name and the password
         SysFreeString(sUser); 
         SysFreeString(sPassword); 

         long lUserCount; 
         // get the count of registered user
         pSnk->get_UserCount (&lUserCount); 

     BSTR UserName;
     BSTR Password;
     for (long i = 0 ; i < lUserCount ; i++)
     {
        pSnk->GetPassword (i,&Password);
        //do something with the password
        //..............................
        pSnk->GetUsername (i,&UserName);
        //do something with the name
        //..............................
        SysFreeString(UserName);
        SysFreeString(Password);
     }
       UserName = SysAllocString(L"User2");;
       
       //Find the ID of a given user
       long ID;
       pSnk->FindUser (UserName,&ID);
       //change the password for the user ID.
       sPassword = SysAllocString(L"XYZ0");
       pSnk->SetPassword (ID,sPassword);
       SysFreeString(UserName);
       SysFreeString(sPassword);    
       //get number of connections connected to the server.
       pSnk->get_ConnectionCount(&lCount);   
       ILMNetSnkConnection* pcon;
       pSnk->FindConnection(1, &pcon);
       pcon->Release();
       pSnk->get_FirstConnection (&pcon);
      // Check all connections with the server.
       while(pcon)
       {
          ILMNetSnkConnection* pnext;
          BSTR bstr;
          pcon->ILMNetSnkConnection__get_NextConnection (&pnext);
          long id;
          pcon->get_ID (&id);
          pcon->get_Username (&bstr);                
          ::SysFreeString(bstr);
          pcon->get_Address (&bstr);
         //Enable the connection
        pcon->put_Enabled(VARIANT_TRUE);
 // Check if connection is enabled or not.
          VARIANT_BOOL enabled;
          pcon->get_Enabled (&enabled);
          VARIANT_BOOL connected;
           pcon->get_Connected(&connected);
           
           // check if this connection is disabled or not connected
           if(enabled == VARIANT_FALSE || connected == VARIANT_FALSE)
           {
             //if the connection is disabled
             //close this connection OPTIONAL
             pcon->Close ();
          }
          pcon->Release();
          pcon = pnext;
       }

       //add a restriction to the client which has the IP = 10.0.0.5
       //this will not allow him to connect to the server.
       BSTR bstrAddress = SysAllocString(L"10.0.0.5");
       // Number of restrictions we have.
       long lRestrictionCount = 0;
       pSnk->AddRestriction(bstrAddress,&lRestrictionCount);
       SysFreeString(bstrAddress);    

       // get Number of restriction
       pSnk->get_RestrictionCount (&lRestrictionCount);

        for(i = 0 ; i < lRestrictionCount ; i++)
        {
           BSTR bstrRestriction;
           pSnk->GetRestriction (i,&bstrRestriction);
           // do something with Restriction
           //..............................
           //free the Restriction name
           SysFreeString(bstrRestriction);
        }
        long lRestriction ;
        pSnk->FindRestriction (bstrAddress,&lRestriction);

        // Remove the Restriction from the user
        pSnk->RemoveRestriction (lRestriction);

        // Remove User2 from the registered users list.
        UserName = SysAllocString(L"User2");
        pSnk->FindUser (UserName,&ID);
        pSnk->RemoveUser(ID);
        SysFreeString(UserName);    
        //Remove all restrctions
        pSnk->RemoveAllRestrictions ();   
        pSnk->CloseAll ();
        pSnk->RemoveAllUsers();    }
      }
    pSnk->Release();         
   }
}
HRESULT AddNetTarget()
{
 IltmmTargetFormats* formats;
 HRESULT hr;
 
 hr = pCapture->get_TargetFormats(&formats);
 if(FAILED(hr))
    return hr;
 BSTR bstr = SysAllocString(L"Net Server Target");
 if(!bstr)
 {
    formats->Release();
    return E_OUTOFMEMORY;
 }
 
 long index;
 
 hr = formats->Find (bstr, &index);
 if(FAILED(hr))
 {
    formats->Release();
    SysFreeString(bstr);
    return hr;
 }
 if(index == -1)
 {     
    hr = formats->Add(bstr, -1);
    SysFreeString(bstr);
    if(FAILED(hr))
    {
       formats->Release();
       return hr;
    }
    long count;
    hr = formats->get_Count(&count);
    if(FAILED(hr))
    {
       formats->Release();
       return hr;
    }
    index = count - 1;
    IltmmTargetFormat* format;
    hr = formats->Item(index, &format);
    if(FAILED(hr))
    {
       formats->Release();
       return hr;
    }
    bstr = SysAllocString(L"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\\{E2B7DE05-38C5-11D5-91F6-00104BDB8FF9}");
    if(!bstr)
    {
       format->Release();
       formats->Remove(index);
       formats->Release();
       return E_OUTOFMEMORY;
    }
    hr = format->put_Sink(bstr);
    SysFreeString(bstr);
    if(FAILED(hr))
    {
       format->Release();
       formats->Remove(index);
       formats->Release();
       return hr;
    }
    
    bstr = SysAllocString(L"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\\{E2B7DE01-38C5-11D5-91F6-00104BDB8FF9}");
    if(!bstr)
    {
       format->Release();
       formats->Remove(index);
       formats->Release();
       return E_OUTOFMEMORY;
    }
    hr = format->put_Mux(bstr);
    SysFreeString(bstr);
    if(FAILED(hr))
    {
       format->Release();
       formats->Remove(index);
       formats->Release();
       return hr;
    }
    format->Release();      
 }
 else
 {
    SysFreeString(bstr);
 }
 formats->Release();
 return S_OK;
}