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; 
   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(TEXT("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->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(int 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();    
      }
      pUnk->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;
}