Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 
     19 #ifndef OSCL_EXCLUSIVE_PTR_H_INCLUDED
     20 #include "oscl_exclusive_ptr.h"
     21 #endif
     22 #ifndef PVLOGGER_H_INCLUDED
     23 #include "pvlogger.h"
     24 #endif
     25 #ifndef PVMF_BASIC_ERRORINFOMESSAGE_H_INCLUDED
     26 #include "pvmf_basic_errorinfomessage.h"
     27 #endif
     28 #ifndef PVMF_ERRORINFOMESSAGE_EXTENSION_H_INCLUDED
     29 #include "pvmf_errorinfomessage_extension.h"
     30 #endif
     31 #ifndef PVMF_CPMPLUGIN_INTERFACE_H_INCLUDED
     32 #include "pvmf_cpmplugin_interface.h"
     33 #endif
     34 #ifndef PVMF_CPMPLUGIN_AUTHORIZATION_INTERFACE_H_INCLUDED
     35 #include "pvmf_cpmplugin_authorization_interface.h"
     36 #endif
     37 #ifndef PVMF_CPMPLUGIN_AUTHENTICATION_INTERFACE_H_INCLUDED
     38 #include "pvmf_cpmplugin_authentication_interface.h"
     39 #endif
     40 #ifndef PVMF_CPMPLUGIN_ACCESS_INTERFACE_FACTORY_H_INCLUDED
     41 #include "pvmf_cpmplugin_access_interface_factory.h"
     42 #endif
     43 #ifndef CPM_H_INCLUDED
     44 #include "cpm.h"
     45 #endif
     46 #ifndef CPM_INTERNAL_H_INCLUDED
     47 #include "cpm_internal.h"
     48 #endif
     49 #ifndef CPM_PLUGIN_REGISTRY_H
     50 #include "cpm_plugin_registry.h"
     51 #endif
     52 #ifndef OSCL_DLL_H_INCLUDED
     53 #include "oscl_dll.h"
     54 #endif
     55 #ifndef OSCL_MIME_STRING_UTILS_H
     56 #include "pv_mime_string_utils.h"
     57 #endif
     58 // Define entry point for this DLL
     59 OSCL_DLL_ENTRY_POINT_DEFAULT()
     60 
     61 #include "oscl_registry_access_client.h"
     62 
     63 static void _AddPluginInstance(CPMPluginRegistry* aRegistry, PVMFCPMPluginFactory* aFactory, const OSCL_String& aMimestring)
     64 {
     65     if (aRegistry
     66             && aFactory)
     67     {
     68         //Create an instance of the plugin.
     69         PVMFCPMPluginInterface* plugin = aFactory->CreateCPMPlugin();
     70         if (plugin)
     71         {
     72             //Package the plugin with its user authentication data.
     73             CPMPluginContainer container(*plugin, NULL);
     74             //Add the plugin to the registry with its mime string.
     75             aRegistry->addPluginToRegistry((OSCL_String&)aMimestring, container);
     76         }
     77     }
     78 }
     79 
     80 static void _RemovePluginInstance(CPMPluginRegistry* aRegistry, PVMFCPMPluginFactory* aFactory, const OSCL_String& aMimestring)
     81 {
     82     if (aRegistry)
     83     {
     84         if (aFactory)
     85         {
     86             CPMPluginContainer* container = aRegistry->lookupPlugin((OSCL_String&)aMimestring);
     87             if (container)
     88                 aFactory->DestroyCPMPlugin(&container->PlugIn());
     89         }
     90         aRegistry->removePluginFromRegistry((OSCL_String&)aMimestring);
     91     }
     92 }
     93 
     94 #ifdef USE_LOADABLE_MODULES
     95 #include "oscl_shared_library.h"
     96 #include "osclconfig_lib.h"
     97 
     98 static void _AddLoadablePlugins(CPMPluginRegistry* pRegistry)
     99 {
    100     if (!pRegistry)
    101         return;
    102 
    103     //Create a list of all libs that implement CPM registry populator
    104     pRegistry->AccessSharedLibraryList() = OSCL_NEW(OsclSharedLibraryList, ());
    105     OSCL_HeapString<OsclMemAllocator> configPath = PV_DYNAMIC_LOADING_CONFIG_FILE_PATH;
    106     pRegistry->AccessSharedLibraryList()->Populate(configPath, PVMF_CPM_PLUGIN_REGISTRY_POPULATOR_UUID);
    107 
    108     //For each lib, add its factory to the registry.
    109     for (uint32 i = 0; i < pRegistry->AccessSharedLibraryList()->Size(); i++)
    110     {
    111         OsclAny* temp = NULL;
    112         pRegistry->AccessSharedLibraryList()->QueryInterfaceAt(i, temp);
    113         PVMFCPMPluginRegistryPopulator* pop = (PVMFCPMPluginRegistryPopulator*) temp;
    114         if (pop)
    115         {
    116             OSCL_HeapString<OsclMemAllocator> mimestring;
    117             PVMFCPMPluginFactory* fac = pop->GetFactoryAndMimeString(mimestring);
    118             if (fac)
    119                 _AddPluginInstance(pRegistry, fac, mimestring);
    120         }
    121     }
    122 }
    123 static void _RemoveLoadablePlugins(CPMPluginRegistry* aRegistry)
    124 {
    125     if (!aRegistry)
    126         return;
    127 
    128     if (aRegistry->AccessSharedLibraryList())
    129     {
    130         //Loop through loaded modules & remove plugin from list.
    131         for (uint32 i = 0; i < aRegistry->AccessSharedLibraryList()->Size(); i++)
    132         {
    133             OsclAny* temp = NULL;
    134             aRegistry->AccessSharedLibraryList()->QueryInterfaceAt(i, temp);
    135             PVMFCPMPluginRegistryPopulator* pop = (PVMFCPMPluginRegistryPopulator*) temp;
    136             if (pop)
    137             {
    138                 OSCL_HeapString<OsclMemAllocator> mimestring;
    139                 PVMFCPMPluginFactory* fac = pop->GetFactoryAndMimeString(mimestring);
    140                 if (fac)
    141                 {
    142                     _RemovePluginInstance(aRegistry, fac, mimestring);
    143                     pop->ReleaseFactory();
    144                 }
    145             }
    146         }
    147 
    148         //Delete loaded module list
    149         OSCL_DELETE(aRegistry->AccessSharedLibraryList());
    150         aRegistry->AccessSharedLibraryList() = NULL;
    151     }
    152 }
    153 #endif //USE_LOADABLE_MODULES
    154 
    155 static CPMPluginRegistry* PopulateCPMPluginRegistry()
    156 {
    157     //Create registry
    158     CPMPluginRegistry* pRegistry = CPMPluginRegistryFactory::CreateCPMPluginRegistry();
    159     if (pRegistry)
    160     {
    161         //Add plugins from global component registry.
    162         OsclRegistryAccessClient cli;
    163         if (cli.Connect() == OsclErrNone)
    164         {
    165             //Get all the current CPM plugin factory functions.
    166             Oscl_Vector<OsclRegistryAccessElement, OsclMemAllocator> factories;
    167             OSCL_HeapString<OsclMemAllocator> id("X-CPM-PLUGIN");//PVMF_MIME_CPM_PLUGIN
    168             cli.GetFactories(id, factories);
    169 
    170             //Add each plugin
    171             for (uint32 i = 0; i < factories.size(); i++)
    172             {
    173                 if (factories[i].iFactory)
    174                 {
    175                     _AddPluginInstance(pRegistry, (PVMFCPMPluginFactory*)factories[i].iFactory, factories[i].iMimeString);
    176                 }
    177             }
    178             cli.Close();
    179         }
    180 #ifdef USE_LOADABLE_MODULES
    181         //Add plugins from loadable modules.
    182         _AddLoadablePlugins(pRegistry);
    183 #endif
    184     }
    185     return pRegistry;
    186 }
    187 
    188 static void DePopulateCPMPluginRegistry(CPMPluginRegistry* aRegistry)
    189 {
    190     if (aRegistry)
    191     {
    192 #ifdef USE_LOADABLE_MODULES
    193         //Remove dynamically loaded plugins
    194         _RemoveLoadablePlugins(aRegistry);
    195 #endif
    196         //Remove plugins created by the global component registry.
    197         OsclRegistryAccessClient cli;
    198         if (cli.Connect() == OsclErrNone)
    199         {
    200             //Get all the current CPM plugin factory functions.
    201             Oscl_Vector<OsclRegistryAccessElement, OsclMemAllocator> factories;
    202             OSCL_HeapString<OsclMemAllocator> id("X-CPM-PLUGIN");//PVMF_MIME_CPM_PLUGIN
    203             cli.GetFactories(id, factories);
    204 
    205             for (uint32 i = 0; i < factories.size(); i++)
    206             {
    207                 if (factories[i].iFactory)
    208                 {
    209                     _RemovePluginInstance(aRegistry, (PVMFCPMPluginFactory*)factories[i].iFactory, factories[i].iMimeString);
    210                 }
    211             }
    212             cli.Close();
    213         }
    214         //Destroy the plugin registry
    215         CPMPluginRegistryFactory::DestroyCPMPluginRegistry(aRegistry);
    216     }
    217 }
    218 
    219 OSCL_EXPORT_REF
    220 PVMFCPM* PVMFCPMFactory::CreateContentPolicyManager(PVMFCPMStatusObserver& aObserver)
    221 {
    222     PVMFCPM* cpm = NULL;
    223     int32 err;
    224     OSCL_TRY(err,
    225              /*
    226               * Create Content Policy Manager
    227               */
    228              cpm = OSCL_NEW(PVMFCPMImpl, (aObserver));
    229             );
    230     if (err != OsclErrNone)
    231     {
    232         OSCL_LEAVE(err);
    233     }
    234     return (cpm);
    235 }
    236 
    237 OSCL_EXPORT_REF void PVMFCPMFactory::DestroyContentPolicyManager(PVMFCPM* aCPM)
    238 {
    239     OSCL_DELETE(aCPM);
    240 }
    241 
    242 OSCL_EXPORT_REF PVMFCPMImpl::PVMFCPMImpl(PVMFCPMStatusObserver& aObserver,
    243         int32 aPriority)
    244         : OsclActiveObject(aPriority, "PVMFCPMImpl")
    245         , iObserver(aObserver)
    246 {
    247     iPluginRegistry = NULL;
    248     iLogger = NULL;
    249     iNumQueryAuthenticationInterfacePending = 0;
    250     iNumQueryAuthenticationInterfaceComplete = 0;
    251     iNumRegisteredPlugInInitPending = 0;
    252     iNumRegisteredPlugInInitComplete = 0;
    253     iNumRegisteredPlugInResetPending = 0;
    254     iNumRegisteredPlugInResetComplete = 0;
    255     iNumQueryMetaDataExtensionInterfacePending = 0;
    256     iNumQueryMetaDataExtensionInterfaceComplete = 0;
    257     iLicenseInterface = NULL;
    258     iNumQueryCapConfigExtensionInterfacePending = 0;
    259     iNumQueryCapConfigExtensionInterfaceComplete = 0;
    260 
    261     iGetMetaDataKeysFromPlugInsDone = false;
    262     iGetMetaDataKeysInProgress = false;
    263 
    264     iExtensionRefCount = 0;
    265     iGetLicenseCmdId = 0;
    266 
    267     int32 err = OsclErrNone;
    268     OSCL_TRY(err,
    269              /*
    270               * Create the input command queue.  Use a reserve to avoid lots of
    271               * dynamic memory allocation
    272               */
    273              iInputCommands.Construct(PVMF_CPM_COMMAND_ID_START,
    274                                       PVMF_CPM_INTERNAL_CMDQ_SIZE);
    275 
    276              /*
    277               * Create the "current command" queue.  It will only contain one
    278               * command at a time, so use a reserve of 1
    279               */
    280              iCurrentCommand.Construct(0, 1);
    281              /*
    282               * Create the "cancel command" queue.  It will only contain one
    283               * command at a time, so use a reserve of 1.
    284               */
    285              iCancelCommand.Construct(0, 1);
    286 
    287             );
    288     if (err != OsclErrNone)
    289     {
    290         OSCL_LEAVE(err);
    291     }
    292 }
    293 
    294 PVMFCPMImpl::~PVMFCPMImpl()
    295 {
    296     /*
    297      * Cleanup commands
    298      * The command queues are self-deleting, but we want to
    299      * notify the observer of unprocessed commands.
    300      */
    301     while (!iCancelCommand.empty())
    302     {
    303         CommandComplete(iCancelCommand, iCancelCommand.front(), PVMFFailure);
    304     }
    305     while (!iCurrentCommand.empty())
    306     {
    307         CommandComplete(iCurrentCommand, iCurrentCommand.front(), PVMFFailure);
    308     }
    309     while (!iInputCommands.empty())
    310     {
    311         CommandComplete(iInputCommands, iInputCommands.front(), PVMFFailure);
    312     }
    313 
    314     //Disconnect from all plugins in case it wasn't done in Reset.
    315     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    316     for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
    317     {
    318         if (it->iConnected)
    319             it->iPlugInInterface->Disconnect(it->iPlugInSessionID);
    320         it->iConnected = false;
    321     }
    322 
    323     /* Clear all vectors */
    324     iPlugInParamsVec.clear();
    325     iActivePlugInParamsVec.clear();
    326     iContentUsageContextVec.clear();
    327     iListofActiveSessions.clear();
    328 }
    329 
    330 OSCL_EXPORT_REF void PVMFCPMImpl::ThreadLogon()
    331 {
    332     iLogger = PVLogger::GetLoggerObject("PVMFCPMImpl");
    333 
    334     AddToScheduler();
    335 
    336     //Create the plugin registry and leave in case there
    337     // are no plugins.  This is done here in order to allow the
    338     // source node to avoid going through a series of unnecessary
    339     // async commands.
    340 
    341     /*
    342      * Create plugin params for all registered plugins. This container class
    343      * holds all the required info about the plugin, thereby obviating the need
    344      * to query the registry all the time for info
    345      */
    346     iNumRegisteredPlugInInitPending = 0;
    347     iNumRegisteredPlugInInitComplete = 0;
    348     iNumQueryMetaDataExtensionInterfacePending = 0;
    349     iNumQueryMetaDataExtensionInterfaceComplete = 0;
    350 
    351     //create the plugin registry, instantiating all the current plugins
    352     //from the factory registry.
    353     //first remove any old registry.
    354     if (iPluginRegistry)
    355     {
    356         DePopulateCPMPluginRegistry(iPluginRegistry);
    357         /** Cleanup all registered plugins*/
    358         iPluginRegistry = NULL;
    359         /* Clear all vectors */
    360         iPlugInParamsVec.clear();
    361         iActivePlugInParamsVec.clear();
    362         iContentUsageContextVec.clear();
    363         iListofActiveSessions.clear();
    364         /**/
    365     }
    366 
    367     iPluginRegistry = PopulateCPMPluginRegistry();
    368 
    369     //check for empty registry & leave.
    370     if (iPluginRegistry
    371             && iPluginRegistry->GetNumPlugIns() == 0)
    372     {
    373         CPMPluginRegistryFactory::DestroyCPMPluginRegistry(iPluginRegistry);
    374         iPluginRegistry = NULL;
    375         OSCL_LEAVE(OsclErrGeneral);
    376     }
    377 
    378 }
    379 
    380 OSCL_EXPORT_REF void PVMFCPMImpl::ThreadLogoff()
    381 {
    382     //Note: registry cleanup logically belongs under Reset command, but
    383     //some nodes currently hang onto their access interfaces after
    384     //CPM is reset, which means the plugins need to survive until after
    385     //the access interfaces are cleaned up.
    386     //@TODO this should be moved to the CompleteCPMReset routine.
    387     if (iPluginRegistry)
    388     {
    389         DePopulateCPMPluginRegistry(iPluginRegistry);
    390         iPluginRegistry = NULL;
    391         //clear the plugin params vec since all plugins are destroyed.
    392         iPlugInParamsVec.clear();
    393     }
    394 
    395     Cancel();
    396 
    397     if (IsAdded())
    398     {
    399         RemoveFromScheduler();
    400     }
    401 }
    402 
    403 OSCL_EXPORT_REF void PVMFCPMImpl::addRef()
    404 {
    405     iExtensionRefCount++;
    406 }
    407 
    408 OSCL_EXPORT_REF void PVMFCPMImpl::removeRef()
    409 {
    410     --iExtensionRefCount;
    411 }
    412 
    413 OSCL_EXPORT_REF bool PVMFCPMImpl::queryInterface(const PVUuid& uuid,
    414         PVInterface*& iface)
    415 {
    416     iface = NULL;
    417     if (uuid == KPVMFMetadataExtensionUuid)
    418     {
    419         PVMFMetadataExtensionInterface* myInterface =
    420             OSCL_STATIC_CAST(PVMFMetadataExtensionInterface*, this);
    421         iface = OSCL_STATIC_CAST(PVInterface*, myInterface);
    422         return true;
    423     }
    424     else if (uuid == PVMFCPMPluginLicenseInterfaceUuid)
    425     {
    426         PVMFCPMPluginLicenseInterface* myInterface =
    427             OSCL_STATIC_CAST(PVMFCPMPluginLicenseInterface*, this);
    428         iface = OSCL_STATIC_CAST(PVInterface*, myInterface);
    429         return true;
    430     }
    431     else if (uuid == PVMI_CAPABILITY_AND_CONFIG_PVUUID)
    432     {
    433         PvmiCapabilityAndConfig* myInterface =
    434             OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, this);
    435         iface = OSCL_STATIC_CAST(PVInterface*, myInterface);
    436         return true;
    437     }
    438     return false;
    439 }
    440 
    441 OSCL_EXPORT_REF PVMFCommandId PVMFCPMImpl::Init(const OsclAny* aContext)
    442 {
    443     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:Init"));
    444     PVMFCPMCommand cmd;
    445     cmd.Construct(PVMF_CPM_INIT, aContext);
    446     return QueueCommandL(cmd);
    447 }
    448 
    449 OSCL_EXPORT_REF PVMFCommandId
    450 PVMFCPMImpl::OpenSession(PVMFSessionId& aSessionId,
    451                          const OsclAny* aContext)
    452 {
    453     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:OpenSession"));
    454     PVMFCPMCommand cmd;
    455     cmd.Construct(PVMF_CPM_OPEN_SESSION,
    456                   &aSessionId,
    457                   aContext);
    458     return QueueCommandL(cmd);
    459 }
    460 
    461 OSCL_EXPORT_REF PVMFCommandId
    462 PVMFCPMImpl::RegisterContent(PVMFSessionId aSessionId,
    463                              OSCL_wString& aSourceURL,
    464                              PVMFFormatType& aSourceFormat,
    465                              OsclAny* aSourceData,
    466                              const OsclAny* aContext)
    467 {
    468     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:RegisterContent"));
    469     PVMFCPMCommand cmd;
    470     cmd.Construct(aSessionId,
    471                   PVMF_CPM_REGISTER_CONTENT,
    472                   &aSourceURL,
    473                   &aSourceFormat,
    474                   aSourceData,
    475                   NULL,
    476                   aContext);
    477     return QueueCommandL(cmd);
    478 }
    479 
    480 OSCL_EXPORT_REF PVMFStatus
    481 PVMFCPMImpl::GetContentAccessFactory(PVMFSessionId aSessionId,
    482                                      PVMFCPMPluginAccessInterfaceFactory*& aContentAccessFactory)
    483 {
    484     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetContentAccessFactory"));
    485 
    486     aContentAccessFactory = NULL;
    487     CPMSessionInfo* sInfo = LookUpSessionInfo(aSessionId);
    488     if (sInfo != NULL)
    489     {
    490         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    491         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
    492         {
    493             if (it->iPlugInID == sInfo->iAccessPlugInID)
    494             {
    495                 it->iPlugInAccessInterfaceFactory->addRef();
    496                 aContentAccessFactory = it->iPlugInAccessInterfaceFactory;
    497                 return PVMFSuccess;
    498             }
    499         }
    500         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::GetContentAccessFactory - No Access Plugin"));
    501     }
    502     else
    503     {
    504         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::GetContentAccessFactory - Invalid Session ID"));
    505     }
    506     return PVMFFailure;
    507 }
    508 
    509 OSCL_EXPORT_REF PVMFCommandId
    510 PVMFCPMImpl::ApproveUsage(PVMFSessionId aSessionId,
    511                           PvmiKvp& aRequestedUsage,
    512                           PvmiKvp& aApprovedUsage,
    513                           PvmiKvp& aAuthorizationData,
    514                           PVMFCPMUsageID& aUsageID,
    515                           const OsclAny* aContext)
    516 {
    517     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::ApproveUsage"));
    518     PVMFCPMCommand cmd;
    519     cmd.Construct(aSessionId,
    520                   PVMF_CPM_APPROVE_USAGE,
    521                   &aRequestedUsage,
    522                   &aApprovedUsage,
    523                   &aAuthorizationData,
    524                   &aUsageID,
    525                   aContext);
    526     return QueueCommandL(cmd);
    527 }
    528 
    529 PVMFCPMContentType PVMFCPMImpl::GetCPMContentType(PVMFSessionId aSessionId)
    530 {
    531     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetCPMContentType"));
    532     CPMSessionInfo* sInfo = LookUpSessionInfo(aSessionId);
    533     if (sInfo != NULL)
    534     {
    535         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    536         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
    537         {
    538             if (it->iPlugInID == sInfo->iAccessPlugInID)
    539             {
    540                 return (it->iPlugInInterface->GetCPMContentType());
    541             }
    542         }
    543     }
    544     return PVMF_CPM_CONTENT_FORMAT_UNKNOWN;
    545 }
    546 
    547 OSCL_EXPORT_REF PVMFStatus PVMFCPMImpl::GetCPMContentFilename(PVMFSessionId aSessionId, OSCL_wString& aFileName)
    548 {
    549     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetCPMContentFilename"));
    550     CPMSessionInfo* sInfo = LookUpSessionInfo(aSessionId);
    551     if (sInfo != NULL)
    552     {
    553         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    554         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
    555         {
    556             if (it->iPlugInID == sInfo->iAccessPlugInID)
    557             {
    558                 return (it->iPlugInInterface->GetCPMContentFilename(aFileName));
    559             }
    560         }
    561     }
    562     return PVMF_CPM_CONTENT_FORMAT_UNKNOWN;
    563 }
    564 
    565 
    566 OSCL_EXPORT_REF PVMFCommandId
    567 PVMFCPMImpl::UsageComplete(PVMFSessionId aSessionId,
    568                            PVMFCPMUsageID& aUsageID,
    569                            OsclAny* aContext)
    570 {
    571     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::UsageComplete"));
    572     PVMFCPMCommand cmd;
    573     cmd.Construct(aSessionId,
    574                   PVMF_CPM_USAGE_COMPLETE,
    575                   NULL,
    576                   NULL,
    577                   &aUsageID,
    578                   NULL,
    579                   aContext);
    580     return QueueCommandL(cmd);
    581 }
    582 
    583 OSCL_EXPORT_REF PVMFCommandId
    584 PVMFCPMImpl::CloseSession(PVMFSessionId& aSessionId,
    585                           const OsclAny* aContext)
    586 {
    587     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::CloseSession"));
    588     PVMFCPMCommand cmd;
    589     cmd.Construct(PVMF_CPM_CLOSE_SESSION,
    590                   &aSessionId,
    591                   aContext);
    592     return QueueCommandL(cmd);
    593 }
    594 
    595 OSCL_EXPORT_REF PVMFCommandId PVMFCPMImpl::Reset(const OsclAny* aContext)
    596 {
    597     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::Reset"));
    598     PVMFCPMCommand cmd;
    599     cmd.Construct(PVMF_CPM_RESET, aContext);
    600     return QueueCommandL(cmd);
    601 }
    602 
    603 OSCL_EXPORT_REF PVMFCommandId
    604 PVMFCPMImpl::GetNodeMetadataKeys(PVMFSessionId aSessionId,
    605                                  PVMFMetadataList& aKeyList,
    606                                  uint32 aStartingKeyIndex,
    607                                  int32 aMaxKeyEntries,
    608                                  char* aQueryKeyString,
    609                                  const OsclAny* aContextData)
    610 {
    611     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetNodeMetadataKeys"));
    612     PVMFCPMCommand cmd;
    613     cmd.Construct(aSessionId,
    614                   PVMF_CPM_GET_METADATA_KEYS,
    615                   aKeyList,
    616                   aStartingKeyIndex,
    617                   aMaxKeyEntries,
    618                   aQueryKeyString,
    619                   aContextData);
    620     return QueueCommandL(cmd);
    621 }
    622 
    623 OSCL_EXPORT_REF PVMFCommandId
    624 PVMFCPMImpl::GetNodeMetadataValues(PVMFSessionId aSessionId,
    625                                    PVMFMetadataList& aKeyList,
    626                                    Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList,
    627                                    uint32 aStartingValueIndex,
    628                                    int32 aMaxValueEntries,
    629                                    const OsclAny* aContextData)
    630 {
    631     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetNodeMetadataValues"));
    632     PVMFCPMCommand cmd;
    633     cmd.Construct(aSessionId,
    634                   PVMF_CPM_GET_METADATA_VALUES,
    635                   aKeyList,
    636                   aValueList,
    637                   aStartingValueIndex,
    638                   aMaxValueEntries,
    639                   aContextData);
    640     return QueueCommandL(cmd);
    641 }
    642 
    643 OSCL_EXPORT_REF PVMFStatus
    644 PVMFCPMImpl::ReleaseNodeMetadataKeys(PVMFMetadataList& aKeyList,
    645                                      uint32 aStartingKeyIndex,
    646                                      uint32 aEndKeyIndex)
    647 {
    648     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::ReleaseNodeMetadataKeys called"));
    649     if (((int32)aStartingKeyIndex < 0) ||
    650             (aStartingKeyIndex > aEndKeyIndex) ||
    651             (aKeyList.size() == 0))
    652     {
    653         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::ReleaseNodeMetadataKeys() Invalid start/end index"));
    654         return PVMFErrArgument;
    655     }
    656     if (aEndKeyIndex >= aKeyList.size())
    657     {
    658         aEndKeyIndex = aKeyList.size() - 1;
    659     }
    660 
    661     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    662     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
    663     {
    664         uint32 plugInStartIndex = it->iMetaDataKeyStartIndex;
    665         uint32 plugInEndIndex = it->iMetaDataKeyEndIndex;
    666 
    667         uint32 releaseStartIndex = 0;
    668         uint32 releaseEndIndex = 0;
    669 
    670         if ((aStartingKeyIndex >= plugInStartIndex) &&
    671                 (aStartingKeyIndex <= plugInEndIndex))
    672         {
    673             releaseStartIndex = aStartingKeyIndex;
    674             if (aEndKeyIndex > plugInEndIndex)
    675             {
    676                 releaseEndIndex = plugInEndIndex;
    677             }
    678             else
    679             {
    680                 releaseEndIndex = aEndKeyIndex;
    681             }
    682 
    683             if (NULL != it->iPlugInMetaDataExtensionInterface)
    684             {
    685                 it->iPlugInMetaDataExtensionInterface->ReleaseNodeMetadataKeys(aKeyList,
    686                         releaseStartIndex,
    687                         releaseEndIndex);
    688             }
    689         }
    690         aStartingKeyIndex = releaseEndIndex + 1;
    691     }
    692     return PVMFSuccess;
    693 }
    694 
    695 OSCL_EXPORT_REF PVMFStatus
    696 PVMFCPMImpl::ReleaseNodeMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList,
    697                                        uint32 aStartingValueIndex,
    698                                        uint32 aEndValueIndex)
    699 {
    700     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::ReleaseNodeMetadataValues called"));
    701 
    702     if (((int32)aStartingValueIndex < 0) ||
    703             (aStartingValueIndex > aEndValueIndex) ||
    704             (aValueList.size() == 0))
    705     {
    706         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::ReleaseNodeMetadataValues() Invalid start/end index"));
    707         return PVMFErrArgument;
    708     }
    709 
    710     if (aEndValueIndex >= aValueList.size())
    711     {
    712         aEndValueIndex = aValueList.size() - 1;
    713     }
    714 
    715     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
    716     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
    717     {
    718         uint32 plugInStartIndex = it->iMetaDataValueStartIndex;
    719         uint32 plugInEndIndex = it->iMetaDataValueEndIndex;
    720 
    721         uint32 releaseStartIndex = 0;
    722         uint32 releaseEndIndex = 0;
    723 
    724         if ((aStartingValueIndex >= plugInStartIndex) &&
    725                 (aStartingValueIndex <= plugInEndIndex))
    726         {
    727             releaseStartIndex = aStartingValueIndex;
    728             if (aEndValueIndex > plugInEndIndex)
    729             {
    730                 releaseEndIndex = plugInEndIndex;
    731             }
    732             else
    733             {
    734                 releaseEndIndex = aEndValueIndex;
    735             }
    736             if (NULL != it->iPlugInMetaDataExtensionInterface)
    737             {
    738                 it->iPlugInMetaDataExtensionInterface->ReleaseNodeMetadataValues(aValueList,
    739                         releaseStartIndex,
    740                         releaseEndIndex);
    741             }
    742         }
    743         aStartingValueIndex = releaseEndIndex + 1;
    744     }
    745     return PVMFSuccess;
    746 }
    747 
    748 OSCL_EXPORT_REF PVMFCommandId
    749 PVMFCPMImpl::QueryInterface(PVMFSessionId aSessionId,
    750                             const PVUuid& aUuid,
    751                             PVInterface*& aInterfacePtr,
    752                             const OsclAny* aContext)
    753 {
    754     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::GetNodeMetadataValues"));
    755     PVMFCPMCommand cmd;
    756     cmd.PVMFCPMCommandBase::Construct(aSessionId,
    757                                       PVMF_CPM_QUERY_INTERFACE,
    758                                       aUuid,
    759                                       aInterfacePtr,
    760                                       aContext);
    761     return QueueCommandL(cmd);
    762 }
    763 
    764 
    765 /**
    766  * This routine is called by various command APIs to queue an
    767  * asynchronous command for processing by the command handler AO.
    768  * This function may leave if the command can't be queued due to
    769  * memory allocation failure.
    770  */
    771 PVMFCommandId PVMFCPMImpl::QueueCommandL(PVMFCPMCommand& aCmd)
    772 {
    773     PVMFCommandId id;
    774     id = iInputCommands.AddL(aCmd);
    775     /* wakeup the AO */
    776     RunIfNotReady();
    777     return id;
    778 }
    779 
    780 /**
    781  * The various command handlers call this when a command is complete.
    782  */
    783 void PVMFCPMImpl::CommandComplete(PVMFCPMCommandCmdQ& aCmdQ,
    784                                   PVMFCPMCommand& aCmd,
    785                                   PVMFStatus aStatus,
    786                                   OsclAny* aEventData,
    787                                   PVUuid* aEventUUID,
    788                                   int32* aEventCode)
    789 {
    790     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::CommandComplete Id %d Cmd %d Status %d Context %d Data %d"
    791                       , aCmd.iId, aCmd.iCmd, aStatus, aCmd.iContext, aEventData));
    792 
    793     PVInterface* extif = NULL;
    794     PVMFBasicErrorInfoMessage* errormsg = NULL;
    795     if (aEventUUID && aEventCode)
    796     {
    797         errormsg = OSCL_NEW(PVMFBasicErrorInfoMessage, (*aEventCode, *aEventUUID, NULL));
    798         extif = OSCL_STATIC_CAST(PVInterface*, errormsg);
    799     }
    800 
    801     /* create response */
    802     PVMFCmdResp resp(aCmd.iId, aCmd.iContext, aStatus, extif, aEventData);
    803 
    804     /* Erase the command from the queue */
    805     aCmdQ.Erase(&aCmd);
    806 
    807     /* Report completion to the session observer */
    808     iObserver.CPMCommandCompleted(resp);
    809 
    810     if (errormsg)
    811     {
    812         errormsg->removeRef();
    813     }
    814 
    815     /* Reschedule AO if input command queue is not empty */
    816     if (!iInputCommands.empty()
    817             && IsAdded())
    818     {
    819         RunIfNotReady();
    820     }
    821 }
    822 
    823 void PVMFCPMImpl::CommandComplete(PVMFCPMCommandCmdQ& aCmdQ,
    824                                   PVMFCPMCommand& aCmd,
    825                                   PVMFStatus aStatus,
    826                                   PVInterface* aErrorExtIntf)
    827 {
    828     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::CommandComplete Id %d Cmd %d Status %d"
    829                       , aCmd.iId, aCmd.iCmd, aStatus));
    830 
    831     /* create response */
    832     PVMFCmdResp resp(aCmd.iId, aCmd.iContext, aStatus, aErrorExtIntf, NULL);
    833 
    834     /* Erase the command from the queue */
    835     aCmdQ.Erase(&aCmd);
    836 
    837     /* Report completion to the session observer */
    838     iObserver.CPMCommandCompleted(resp);
    839 
    840     /* Reschedule AO if input command queue is not empty */
    841     if (!iInputCommands.empty())
    842     {
    843         RunIfNotReady();
    844     }
    845 }
    846 
    847 void
    848 PVMFCPMImpl::MoveCmdToCurrentQueue(PVMFCPMCommand& aCmd)
    849 {
    850     int32 err = OsclErrNone;
    851     OSCL_TRY(err, iCurrentCommand.StoreL(aCmd););
    852     if (err != OsclErrNone)
    853     {
    854         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::MoveCmdToCurrentQueue - No Memory"));
    855         CommandComplete(iInputCommands, aCmd, PVMFErrNoMemory);
    856         return;
    857     }
    858     iInputCommands.Erase(&aCmd);
    859     return;
    860 }
    861 
    862 void
    863 PVMFCPMImpl::MoveCmdToCancelQueue(PVMFCPMCommand& aCmd)
    864 {
    865     /*
    866      * note: the StoreL cannot fail since the queue is never more than 1 deep
    867      * and we reserved space.
    868      */
    869     iCancelCommand.StoreL(aCmd);
    870     iInputCommands.Erase(&aCmd);
    871 }
    872 
    873 PVMFCPMCommandContext* PVMFCPMImpl::RequestNewInternalCmd()
    874 {
    875     int32 i = 0;
    876     /* Search for the next free node command in the pool */
    877     while (i < PVMF_CPM_INTERNAL_CMDQ_SIZE)
    878     {
    879         if (iInternalCmdPool[i].oFree)
    880         {
    881             iInternalCmdPool[i].oFree = false;
    882             return &(iInternalCmdPool[i]);
    883         }
    884         ++i;
    885     }
    886     /* Free one not found so return NULL */
    887     return NULL;
    888 }
    889 
    890 /**
    891  * Called by the command handler AO to process a command from
    892  * the input queue.
    893  * Return true if a command was processed, false if the command
    894  * processor is busy and can't process another command now.
    895  */
    896 bool PVMFCPMImpl::ProcessCommand(PVMFCPMCommand& aCmd)
    897 {
    898     /*
    899      * normally this node will not start processing one command
    900      * until the prior one is finished.  However, a hi priority
    901      * command such as Cancel must be able to interrupt a command
    902      * in progress.
    903      */
    904     if (!iCurrentCommand.empty() && !aCmd.hipri() && aCmd.iCmd != PVMF_CPM_CANCEL_GET_LICENSE)
    905         return false;
    906 
    907     switch (aCmd.iCmd)
    908     {
    909         case PVMF_CPM_INIT:
    910             DoInit(aCmd);
    911             break;
    912 
    913         case PVMF_CPM_OPEN_SESSION:
    914             DoOpenSession(aCmd);
    915             break;
    916 
    917         case PVMF_CPM_REGISTER_CONTENT:
    918             DoRegisterContent(aCmd);
    919             break;
    920 
    921         case PVMF_CPM_APPROVE_USAGE:
    922             DoApproveUsage(aCmd);
    923             break;
    924 
    925         case PVMF_CPM_USAGE_COMPLETE:
    926             DoUsageComplete(aCmd);
    927             break;
    928 
    929         case PVMF_CPM_CLOSE_SESSION:
    930             DoCloseSession(aCmd);
    931             break;
    932 
    933         case PVMF_CPM_RESET:
    934             DoReset(aCmd);
    935             break;
    936 
    937         case PVMF_CPM_GET_METADATA_KEYS:
    938         {
    939             PVMFStatus status = DoGetMetadataKeys(aCmd);
    940             if (status != PVMFPending)
    941             {
    942                 CommandComplete(iInputCommands, aCmd, status);
    943             }
    944             else
    945             {
    946                 MoveCmdToCurrentQueue(aCmd);
    947             }
    948         }
    949         break;
    950 
    951         case PVMF_CPM_GET_METADATA_VALUES:
    952             DoGetMetadataValues(aCmd);
    953             break;
    954 
    955         case PVMF_CPM_QUERY_INTERFACE:
    956             DoQueryInterface(aCmd);
    957             break;
    958 
    959         case PVMF_CPM_GET_LICENSE_W:
    960         {
    961             PVMFStatus status = DoGetLicense(aCmd, true);
    962             if (status == PVMFPending)
    963             {
    964                 MoveCmdToCurrentQueue(aCmd);
    965             }
    966             else
    967             {
    968                 CommandComplete(iInputCommands, aCmd, status);
    969             }
    970         }
    971         break;
    972 
    973         case PVMF_CPM_GET_LICENSE:
    974         {
    975             PVMFStatus status = DoGetLicense(aCmd);
    976             if (status == PVMFPending)
    977             {
    978                 MoveCmdToCurrentQueue(aCmd);
    979             }
    980             else
    981             {
    982                 CommandComplete(iInputCommands, aCmd, status);
    983             }
    984         }
    985         break;
    986 
    987         case PVMF_CPM_CANCEL_GET_LICENSE:
    988             DoCancelGetLicense(aCmd);
    989             break;
    990 
    991         default:
    992         {
    993             /* unknown command type */
    994             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::ProcessCommand - Unknown Command"));
    995             CommandComplete(iInputCommands, aCmd, PVMFErrNotSupported);
    996         }
    997         break;
    998     }
    999 
   1000     return true;
   1001 }
   1002 
   1003 void PVMFCPMImpl::DoInit(PVMFCPMCommand& aCmd)
   1004 {
   1005     if (!iPluginRegistry)
   1006     {
   1007         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoInit - No Plugin Registry"));
   1008         CommandComplete(iInputCommands, aCmd, PVMFFailure);
   1009     }
   1010 
   1011     for (uint32 i = 0; i < iPluginRegistry->GetNumPlugIns(); i++)
   1012     {
   1013         CPMPlugInParams plugInParams;
   1014 
   1015         iPluginRegistry->GetPluginMimeType(i, plugInParams.iPlugInMimeType);
   1016         plugInParams.iPlugInID = i;
   1017 
   1018         CPMPluginContainer* container =
   1019             iPluginRegistry->lookupPlugin(plugInParams.iPlugInMimeType);
   1020 
   1021         if (container)
   1022         {
   1023             PVMFCPMPluginInterface& iface = container->PlugIn();
   1024             OsclAny* _pPlugInData = container->PlugInUserAuthenticationData();
   1025             plugInParams.iPlugInInterface = &iface;
   1026             plugInParams.iPlugInData = _pPlugInData;
   1027             iPlugInParamsVec.push_back(plugInParams);
   1028         }
   1029     }
   1030     /* Connect with all plugins */
   1031     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1032     for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1033     {
   1034         it->iPlugInSessionID = it->iPlugInInterface->Connect(*this);
   1035         it->iConnected = true;
   1036     }
   1037     PVMFStatus status = InitRegisteredPlugIns();
   1038     if (status == PVMFSuccess)
   1039     {
   1040         MoveCmdToCurrentQueue(aCmd);
   1041     }
   1042     else
   1043     {
   1044         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoInit - InitRegisteredPlugIns Failed"));
   1045         CommandComplete(iInputCommands, aCmd, status);
   1046     }
   1047 }
   1048 
   1049 PVMFStatus PVMFCPMImpl::InitRegisteredPlugIns()
   1050 {
   1051     if (iPlugInParamsVec.size() > 0)
   1052     {
   1053         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1054         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1055         {
   1056             /* Get Authentication interface */
   1057             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1058             if (internalCmd != NULL)
   1059             {
   1060                 internalCmd->cmd = PVMF_CPM_INTERNAL_INIT_CMD;
   1061                 internalCmd->parentCmd = PVMF_CPM_INIT;
   1062                 internalCmd->plugInID = it->iPlugInID;
   1063                 OsclAny *cmdContextData =
   1064                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1065 
   1066                 it->iPlugInInterface->Init(it->iPlugInSessionID,
   1067                                            cmdContextData);
   1068                 iNumRegisteredPlugInInitPending++;
   1069             }
   1070             else
   1071             {
   1072                 return PVMFErrNoMemory;
   1073             }
   1074         }
   1075         return PVMFSuccess;
   1076     }
   1077     /* No registered plugins */
   1078     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::InitRegisteredPlugIns - Registered plugin list empty"));
   1079     return PVMFFailure;
   1080 }
   1081 
   1082 void PVMFCPMImpl::CompleteInitPlugIns()
   1083 {
   1084     if (iNumRegisteredPlugInInitPending ==
   1085             iNumRegisteredPlugInInitComplete)
   1086     {
   1087         PVMFStatus status = QueryForPlugInMetaDataExtensionInterface();
   1088 
   1089         if (status != PVMFSuccess)
   1090         {
   1091             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteInitPlugIns - QueryForPlugInAuthenticationInterface Failed"));
   1092             CommandComplete(iCurrentCommand,
   1093                             iCurrentCommand.front(),
   1094                             status);
   1095         }
   1096     }
   1097 }
   1098 
   1099 PVMFStatus PVMFCPMImpl::QueryForPlugInMetaDataExtensionInterface()
   1100 {
   1101     if (iPlugInParamsVec.size() > 0)
   1102     {
   1103         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1104         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1105         {
   1106             /* Get MetaDataExtension interface */
   1107             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1108             if (internalCmd != NULL)
   1109             {
   1110                 internalCmd->cmd =
   1111                     PVMF_CPM_INTERNAL_QUERY_METADATA_EXTENSION_INTERFACE_CMD;
   1112                 internalCmd->parentCmd = PVMF_CPM_INIT;
   1113                 internalCmd->plugInID = it->iPlugInID;
   1114                 OsclAny *cmdContextData =
   1115                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1116                 it->iPlugInMetaDataExtensionInterfacePVI = NULL;
   1117                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1118                                                      KPVMFMetadataExtensionUuid,
   1119                                                      it->iPlugInMetaDataExtensionInterfacePVI,
   1120                                                      cmdContextData);
   1121                 iNumQueryMetaDataExtensionInterfacePending++;
   1122             }
   1123             else
   1124             {
   1125                 return PVMFErrNoMemory;
   1126             }
   1127         }
   1128         return PVMFSuccess;
   1129     }
   1130     /* No registered plugins */
   1131     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForPlugInMetaDataExtensionInterface - Registered plugin list empty"));
   1132     return PVMFFailure;
   1133 }
   1134 
   1135 
   1136 void PVMFCPMImpl::CompleteMetaDataExtInterfaceQueryFromPlugIns()
   1137 {
   1138     if (iNumQueryMetaDataExtensionInterfacePending ==
   1139             iNumQueryMetaDataExtensionInterfaceComplete)
   1140     {
   1141         PVMFStatus status = QueryForPlugInCapConfigInterface();
   1142 
   1143         if (status != PVMFSuccess)
   1144         {
   1145             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteMetaDataExtInterfaceQueryFromPlugIns - QueryForPlugInCapConfigInterface Failed"));
   1146             CommandComplete(iCurrentCommand,
   1147                             iCurrentCommand.front(),
   1148                             status);
   1149         }
   1150     }
   1151 }
   1152 
   1153 PVMFStatus PVMFCPMImpl::QueryForPlugInCapConfigInterface()
   1154 {
   1155     if (iPlugInParamsVec.size() > 0)
   1156     {
   1157         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1158         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1159         {
   1160             /* Get MetaDataExtension interface */
   1161             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1162             if (internalCmd != NULL)
   1163             {
   1164                 internalCmd->cmd =
   1165                     PVMF_CPM_INTERNAL_QUERY_CAP_CONFIG_INTERFACE_CMD;
   1166                 internalCmd->parentCmd = PVMF_CPM_INIT;
   1167                 internalCmd->plugInID = it->iPlugInID;
   1168                 OsclAny *cmdContextData =
   1169                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1170                 it->iPlugInCapConfigExtensionInterfacePVI = NULL;
   1171                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1172                                                      PVMI_CAPABILITY_AND_CONFIG_PVUUID,
   1173                                                      it->iPlugInCapConfigExtensionInterfacePVI,
   1174                                                      cmdContextData);
   1175                 iNumQueryCapConfigExtensionInterfacePending++;
   1176             }
   1177             else
   1178             {
   1179                 return PVMFErrNoMemory;
   1180             }
   1181         }
   1182         return PVMFSuccess;
   1183     }
   1184     /* No registered plugins */
   1185     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForPlugInCapConfigInterface - Registered plugin list empty"));
   1186     return PVMFFailure;
   1187 }
   1188 
   1189 
   1190 void PVMFCPMImpl::CompleteCapConfigExtInterfaceQueryFromPlugIns()
   1191 {
   1192     if (iNumQueryCapConfigExtensionInterfacePending ==
   1193             iNumQueryCapConfigExtensionInterfaceComplete)
   1194     {
   1195         PVMFStatus status = QueryForPlugInAuthenticationInterface();
   1196 
   1197         if (status != PVMFSuccess)
   1198         {
   1199             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteCapConfigExtInterfaceQueryFromPlugIns - QueryForPlugInAuthenticationInterface Failed"));
   1200             CommandComplete(iCurrentCommand,
   1201                             iCurrentCommand.front(),
   1202                             status);
   1203         }
   1204     }
   1205 }
   1206 
   1207 PVMFStatus PVMFCPMImpl::QueryForPlugInAuthenticationInterface()
   1208 {
   1209     if (iPlugInParamsVec.size() > 0)
   1210     {
   1211         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1212         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1213         {
   1214             /* Get Authentication interface */
   1215             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1216             if (internalCmd != NULL)
   1217             {
   1218                 internalCmd->cmd =
   1219                     PVMF_CPM_INTERNAL_QUERY_AUTHENTICATION_INTERFACE_CMD;
   1220                 internalCmd->parentCmd = PVMF_CPM_INIT;
   1221                 internalCmd->plugInID = it->iPlugInID;
   1222                 OsclAny *cmdContextData =
   1223                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1224                 it->iPlugInAuthenticationInterfacePVI = NULL;
   1225                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1226                                                      PVMFCPMPluginAuthenticationInterfaceUuid,
   1227                                                      it->iPlugInAuthenticationInterfacePVI,
   1228                                                      cmdContextData);
   1229                 iNumQueryAuthenticationInterfacePending++;
   1230             }
   1231             else
   1232             {
   1233                 return PVMFErrNoMemory;
   1234             }
   1235         }
   1236         return PVMFSuccess;
   1237     }
   1238     /* No registered plugins */
   1239     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForPlugInAuthenticationInterface - Registered plugin list empty"));
   1240     return PVMFFailure;
   1241 }
   1242 
   1243 void PVMFCPMImpl::CompleteCPMInit()
   1244 {
   1245     if (iNumQueryAuthenticationInterfacePending ==
   1246             iNumQueryAuthenticationInterfaceComplete)
   1247     {
   1248         CommandComplete(iCurrentCommand,
   1249                         iCurrentCommand.front(),
   1250                         PVMFSuccess);
   1251     }
   1252 }
   1253 
   1254 void PVMFCPMImpl::DoOpenSession(PVMFCPMCommand& aCmd)
   1255 {
   1256     OsclAny* temp = NULL;
   1257     aCmd.Parse(temp);
   1258     PVMFSessionId* sessionIdPtr = OSCL_STATIC_CAST(PVMFSessionId*, temp);
   1259 
   1260     /* Create a session info */
   1261     CPMSessionInfo sessionInfo;
   1262     sessionInfo.iSessionId = iListofActiveSessions.size();
   1263     *sessionIdPtr = sessionInfo.iSessionId;
   1264     iListofActiveSessions.push_back(sessionInfo);
   1265     PVMFStatus status =
   1266         AuthenticateWithAllRegisteredPlugIns(sessionInfo.iSessionId);
   1267     if (status == PVMFSuccess)
   1268     {
   1269         MoveCmdToCurrentQueue(aCmd);
   1270     }
   1271     else
   1272     {
   1273         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoOpenSession - AuthenticateWithAllRegisteredPlugIns Failed"));
   1274         CommandComplete(iInputCommands, aCmd, status);
   1275     }
   1276 }
   1277 
   1278 PVMFStatus PVMFCPMImpl::AuthenticateWithAllRegisteredPlugIns(PVMFSessionId aSessionId)
   1279 {
   1280     if (iPlugInParamsVec.size() > 0)
   1281     {
   1282         CPMSessionInfo* sessionInfo = LookUpSessionInfo(aSessionId);
   1283 
   1284         if (sessionInfo != NULL)
   1285         {
   1286             Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1287             for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1288             {
   1289                 /* Get Authentication interface */
   1290                 PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1291                 if (internalCmd != NULL)
   1292                 {
   1293                     internalCmd->cmd = PVMF_CPM_INTERNAL_AUTHENTICATE_CMD;
   1294                     internalCmd->parentCmd = PVMF_CPM_OPEN_SESSION;
   1295                     internalCmd->plugInID = it->iPlugInID;
   1296                     OsclAny *cmdContextData =
   1297                         OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1298 
   1299                     it->iPlugInAuthenticationInterface->AuthenticateUser(it->iPlugInSessionID,
   1300                             it->iPlugInData,
   1301                             cmdContextData);
   1302                     sessionInfo->iNumPlugInAunthenticateRequestsPending++;
   1303                 }
   1304                 else
   1305                 {
   1306                     return PVMFErrNoMemory;
   1307                 }
   1308             }
   1309             return PVMFSuccess;
   1310         }
   1311         else
   1312         {
   1313             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::AuthenticateWithAllRegisteredPlugIns - Invalid Session ID"));
   1314             return PVMFErrArgument;
   1315         }
   1316     }
   1317     /* No registered plugins */
   1318     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::AuthenticateWithAllRegisteredPlugIns - Registered plugin list empty"));
   1319     return PVMFFailure;
   1320 }
   1321 
   1322 void PVMFCPMImpl::CompleteOpenSession(CPMSessionInfo* aSessionInfo)
   1323 {
   1324     if (aSessionInfo == NULL)
   1325     {
   1326         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteOpenSession - Invalid Session ID"));
   1327         CommandComplete(iCurrentCommand,
   1328                         iCurrentCommand.front(),
   1329                         PVMFFailure);
   1330     }
   1331     else
   1332     {
   1333         aSessionInfo->iNumPlugInAunthenticateRequestsComplete++;
   1334 
   1335         if (aSessionInfo->iNumPlugInAunthenticateRequestsComplete ==
   1336                 aSessionInfo->iNumPlugInAunthenticateRequestsPending)
   1337         {
   1338             CommandComplete(iCurrentCommand,
   1339                             iCurrentCommand.front(),
   1340                             PVMFSuccess);
   1341         }
   1342     }
   1343     return;
   1344 }
   1345 
   1346 void PVMFCPMImpl::DoRegisterContent(PVMFCPMCommand& aCmd)
   1347 {
   1348     OsclAny* temp1 = NULL;
   1349     OsclAny* temp2 = NULL;
   1350     OsclAny* aSourceData;
   1351     OsclAny* placeHolder;
   1352 
   1353     aCmd.Parse(temp1,
   1354                temp2,
   1355                aSourceData,
   1356                placeHolder);
   1357 
   1358     OSCL_wString* sourceURL = OSCL_STATIC_CAST(OSCL_wString*, temp1);
   1359     PVMFFormatType* sourceFormatType = OSCL_STATIC_CAST(PVMFFormatType*, temp2);
   1360 
   1361     CPMSessionInfo* sInfo = LookUpSessionInfo(aCmd.iSession);
   1362 
   1363     if (sInfo != NULL)
   1364     {
   1365         sInfo->iSourceURL = *sourceURL;
   1366         sInfo->iSourceFormatType = *sourceFormatType;
   1367         sInfo->iSourceData = aSourceData;
   1368         PVMFStatus status = PopulateListOfActivePlugIns(sInfo);
   1369         if (status == PVMFSuccess)
   1370         {
   1371             status = QueryForAuthorizationInterface(sInfo);
   1372             if (status == PVMFSuccess)
   1373             {
   1374                 MoveCmdToCurrentQueue(aCmd);
   1375             }
   1376             else
   1377             {
   1378                 PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoRegisterContent - QueryForAuthorizationInterface Failed"));
   1379                 CommandComplete(iInputCommands, aCmd, status);
   1380             }
   1381         }
   1382         else
   1383         {
   1384             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoRegisterContent - PopulateListOfActivePlugIns Failed"));
   1385             CommandComplete(iInputCommands, aCmd, status);
   1386         }
   1387     }
   1388     else
   1389     {
   1390         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoRegisterContent - Invalid Session ID"));
   1391         CommandComplete(iInputCommands, aCmd, PVMFErrArgument);
   1392     }
   1393 }
   1394 
   1395 PVMFStatus PVMFCPMImpl::PopulateListOfActivePlugIns(CPMSessionInfo* aInfo)
   1396 {
   1397     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1398     for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   1399     {
   1400         PVMFStatus status =
   1401             it->iPlugInInterface->SetSourceInitializationData(aInfo->iSourceURL,
   1402                     aInfo->iSourceFormatType,
   1403                     aInfo->iSourceData);
   1404         if (status == PVMFSuccess)
   1405         {
   1406             /* Add this plug to the active list */
   1407             iActivePlugInParamsVec.push_back(*it);
   1408         }
   1409     }
   1410     if (iActivePlugInParamsVec.size() > 0)
   1411     {
   1412         return PVMFSuccess;
   1413     }
   1414     //no plugins care about this clip
   1415     return PVMFErrNotSupported;
   1416 }
   1417 
   1418 PVMFStatus PVMFCPMImpl::QueryForAuthorizationInterface(CPMSessionInfo* aInfo)
   1419 {
   1420     if (iActivePlugInParamsVec.size() > 0)
   1421     {
   1422         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1423         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1424         {
   1425             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1426             if (internalCmd != NULL)
   1427             {
   1428                 internalCmd->cmd =
   1429                     PVMF_CPM_INTERNAL_QUERY_AUTHORIZATION_INTERFACE_CMD;
   1430                 internalCmd->parentCmd = PVMF_CPM_REGISTER_CONTENT;
   1431                 internalCmd->plugInID = it->iPlugInID;
   1432                 internalCmd->sessionid = aInfo->iSessionId;
   1433                 OsclAny *cmdContextData =
   1434                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1435                 it->iPlugInAuthorizationInterfacePVI = NULL;
   1436                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1437                                                      PVMFCPMPluginAuthorizationInterfaceUuid,
   1438                                                      it->iPlugInAuthorizationInterfacePVI,
   1439                                                      cmdContextData);
   1440                 aInfo->iNumPlugInAuthorizeInterfaceQueryRequestsPending++;
   1441             }
   1442             else
   1443             {
   1444                 return PVMFErrNoMemory;
   1445             }
   1446         }
   1447         return PVMFSuccess;
   1448     }
   1449     /* No active plugins */
   1450     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForAuthorizationInterface - No Active Plugins"));
   1451     return PVMFFailure;
   1452 }
   1453 
   1454 PVMFStatus PVMFCPMImpl::QueryForAccessInterfaceFactory(CPMSessionInfo* aInfo)
   1455 {
   1456     if (iActivePlugInParamsVec.size() > 0)
   1457     {
   1458         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1459         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1460         {
   1461             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1462             if (internalCmd != NULL)
   1463             {
   1464                 internalCmd->cmd =
   1465                     PVMF_CPM_INTERNAL_QUERY_ACCESS_INTERFACE_FACTORY_CMD;
   1466                 internalCmd->parentCmd = PVMF_CPM_REGISTER_CONTENT;
   1467                 internalCmd->plugInID = it->iPlugInID;
   1468                 internalCmd->sessionid = aInfo->iSessionId;
   1469                 OsclAny *cmdContextData =
   1470                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1471                 it->iPlugInAccessInterfaceFactoryPVI = NULL;
   1472                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1473                                                      PVMFCPMPluginAccessInterfaceFactoryUuid,
   1474                                                      it->iPlugInAccessInterfaceFactoryPVI,
   1475                                                      cmdContextData);
   1476                 aInfo->iNumPlugInAccessInterfaceFactoryQueryRequestsPending++;
   1477             }
   1478             else
   1479             {
   1480                 return PVMFErrNoMemory;
   1481             }
   1482         }
   1483         return PVMFSuccess;
   1484     }
   1485     /* No active plugins */
   1486     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForAccessInterfaceFactory - No Active Plugins"));
   1487     return PVMFFailure;
   1488 }
   1489 
   1490 PVMFStatus PVMFCPMImpl::DetermineAccessPlugIn(CPMSessionInfo* aInfo)
   1491 {
   1492     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1493     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1494     {
   1495         if (it->iPlugInAccessInterfaceFactory != NULL)
   1496         {
   1497             aInfo->iAccessPlugInID = it->iPlugInID;
   1498             return PVMFSuccess;
   1499         }
   1500     }
   1501     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DetermineAccessPlugIn Failed"));
   1502     return PVMFFailure;
   1503 }
   1504 
   1505 PVMFStatus PVMFCPMImpl::QueryForLicenseInterface(CPMSessionInfo* aInfo)
   1506 {
   1507     if (iActivePlugInParamsVec.size() > 0)
   1508     {
   1509         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1510         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1511         {
   1512             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1513             if (internalCmd != NULL)
   1514             {
   1515                 internalCmd->cmd =
   1516                     PVMF_CPM_INTERNAL_QUERY_LICENSE_INTERFACE_CMD;
   1517                 internalCmd->parentCmd = PVMF_CPM_REGISTER_CONTENT;
   1518                 internalCmd->plugInID = it->iPlugInID;
   1519                 internalCmd->sessionid = aInfo->iSessionId;
   1520                 OsclAny *cmdContextData =
   1521                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1522                 it->iPlugInLicenseInterfacePVI = NULL;
   1523                 it->iPlugInInterface->QueryInterface(it->iPlugInSessionID,
   1524                                                      PVMFCPMPluginLicenseInterfaceUuid,
   1525                                                      it->iPlugInLicenseInterfacePVI,
   1526                                                      cmdContextData);
   1527                 aInfo->iNumPlugInLicenseAcquisitionInterfaceRequestsPending++;
   1528             }
   1529             else
   1530             {
   1531                 return PVMFErrNoMemory;
   1532             }
   1533         }
   1534         return PVMFSuccess;
   1535     }
   1536     /* No active plugins */
   1537     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForLicenseInterface - No Active Plugins"));
   1538     return PVMFFailure;
   1539 }
   1540 
   1541 void PVMFCPMImpl::CompleteRegisterContentPhase1(CPMSessionInfo* aInfo)
   1542 {
   1543     if (aInfo == NULL)
   1544     {
   1545         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteRegisterContentPhase1 - Invalid Session ID"));
   1546         CommandComplete(iCurrentCommand,
   1547                         iCurrentCommand.front(),
   1548                         PVMFFailure);
   1549     }
   1550     else
   1551     {
   1552         aInfo->iNumPlugInAuthorizeInterfaceQueryRequestsComplete++;
   1553 
   1554         if (aInfo->iNumPlugInAuthorizeInterfaceQueryRequestsComplete ==
   1555                 aInfo->iNumPlugInAuthorizeInterfaceQueryRequestsPending)
   1556         {
   1557             PVMFStatus status = QueryForAccessInterfaceFactory(aInfo);
   1558             if (status != PVMFSuccess)
   1559             {
   1560                 PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteRegisterContentPhase1 - QueryForAccessInterfaceFactory Failed"));
   1561                 CommandComplete(iCurrentCommand,
   1562                                 iCurrentCommand.front(),
   1563                                 status);
   1564             }
   1565         }
   1566     }
   1567     return;
   1568 }
   1569 
   1570 void PVMFCPMImpl::CompleteRegisterContentPhase2(CPMSessionInfo* aInfo)
   1571 {
   1572     if (aInfo == NULL)
   1573     {
   1574         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteRegisterContentPhase2 - Invalid Session ID"));
   1575         CommandComplete(iCurrentCommand,
   1576                         iCurrentCommand.front(),
   1577                         PVMFFailure);
   1578     }
   1579     else
   1580     {
   1581         aInfo->iNumPlugInAccessInterfaceFactoryQueryRequestsComplete++;
   1582 
   1583         if (aInfo->iNumPlugInAccessInterfaceFactoryQueryRequestsComplete ==
   1584                 aInfo->iNumPlugInAccessInterfaceFactoryQueryRequestsPending)
   1585         {
   1586             PVMFStatus status = DetermineAccessPlugIn(aInfo);
   1587             if (status != PVMFSuccess)
   1588             {
   1589                 CommandComplete(iCurrentCommand,
   1590                                 iCurrentCommand.front(),
   1591                                 status);
   1592             }
   1593             else
   1594             {
   1595                 status = QueryForLicenseInterface(aInfo);
   1596                 if (status != PVMFSuccess)
   1597                 {
   1598                     CommandComplete(iCurrentCommand,
   1599                                     iCurrentCommand.front(),
   1600                                     status);
   1601                 }
   1602             }
   1603         }
   1604     }
   1605     return;
   1606 }
   1607 
   1608 void PVMFCPMImpl::CompleteRegisterContentPhase3(CPMSessionInfo* aInfo)
   1609 {
   1610     if (aInfo == NULL)
   1611     {
   1612         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteRegisterContentPhase3 - Invalid Session ID"));
   1613         CommandComplete(iCurrentCommand,
   1614                         iCurrentCommand.front(),
   1615                         PVMFFailure);
   1616     }
   1617     else
   1618     {
   1619         aInfo->iNumPlugInLicenseAcquisitionInterfaceRequestsComplete++;
   1620 
   1621         if (aInfo->iNumPlugInLicenseAcquisitionInterfaceRequestsComplete ==
   1622                 aInfo->iNumPlugInLicenseAcquisitionInterfaceRequestsPending)
   1623         {
   1624             CommandComplete(iCurrentCommand,
   1625                             iCurrentCommand.front(),
   1626                             PVMFSuccess);
   1627         }
   1628     }
   1629     return;
   1630 }
   1631 
   1632 
   1633 void PVMFCPMImpl::DoApproveUsage(PVMFCPMCommand& aCmd)
   1634 {
   1635     OsclAny* temp1 = NULL;
   1636     OsclAny* temp2 = NULL;
   1637     OsclAny* temp3 = NULL;
   1638     OsclAny* temp4 = NULL;
   1639 
   1640     aCmd.Parse(temp1, temp2, temp3, temp4);
   1641 
   1642     PVMFCPMUsageID* usageID = OSCL_STATIC_CAST(PVMFCPMUsageID*, temp4);
   1643 
   1644     /* Create Usage context */
   1645     *usageID = iContentUsageContextVec.size();
   1646     CPMContentUsageContext usageContext;
   1647     usageContext.iUsageID = *usageID;
   1648     iContentUsageContextVec.push_back(usageContext);
   1649 
   1650     PVMFStatus status = RequestApprovalFromActivePlugIns(aCmd);
   1651     if (status == PVMFSuccess)
   1652     {
   1653         MoveCmdToCurrentQueue(aCmd);
   1654     }
   1655     else
   1656     {
   1657         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoApproveUsage - RequestApprovalFromActivePlugIns Failed"));
   1658         CommandComplete(iInputCommands, aCmd, status);
   1659     }
   1660 }
   1661 
   1662 PVMFStatus PVMFCPMImpl::RequestApprovalFromActivePlugIns(PVMFCPMCommand& aCmd)
   1663 {
   1664     if (iActivePlugInParamsVec.size() > 0)
   1665     {
   1666         OsclAny* temp1 = NULL;
   1667         OsclAny* temp2 = NULL;
   1668         OsclAny* temp3 = NULL;
   1669         OsclAny* temp4 = NULL;
   1670 
   1671         aCmd.Parse(temp1, temp2, temp3, temp4);
   1672 
   1673         PvmiKvp* requestedUsage = OSCL_STATIC_CAST(PvmiKvp*, temp1);
   1674         PvmiKvp* approvedUsage = OSCL_STATIC_CAST(PvmiKvp*, temp2);
   1675         PvmiKvp* authorizationData = OSCL_STATIC_CAST(PvmiKvp*, temp3);
   1676         PVMFCPMUsageID* usageID = OSCL_STATIC_CAST(PVMFCPMUsageID*, temp4);
   1677 
   1678         CPMSessionInfo* sInfo = NULL; // initialize to ensure that if LookUpSeesionInfo() fail, sInfo will be NULL
   1679         sInfo = LookUpSessionInfo(aCmd.iSession);
   1680         OSCL_ASSERT(sInfo);
   1681         if (!sInfo)
   1682         {
   1683             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::RequestApprovalFromActivePlugIns - No Session Info"));
   1684             return PVMFFailure;
   1685         }
   1686 
   1687         CPMContentUsageContext* usageContext = LookUpContentUsageContext(*usageID);
   1688         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1689         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1690         {
   1691             if (it->iPlugInID == sInfo->iAccessPlugInID)
   1692             {
   1693                 PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1694                 if (internalCmd != NULL)
   1695                 {
   1696                     internalCmd->cmd = PVMF_CPM_INTERNAL_AUTHORIZE_CMD;
   1697                     internalCmd->parentCmd = PVMF_CPM_APPROVE_USAGE;
   1698                     internalCmd->plugInID = it->iPlugInID;
   1699                     internalCmd->usageid = *usageID;
   1700                     OsclAny *cmdContextData =
   1701                         OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1702 
   1703                     it->iPlugInAuthorizationInterface->AuthorizeUsage(it->iPlugInSessionID,
   1704                             *requestedUsage,
   1705                             *approvedUsage,
   1706                             *authorizationData,
   1707                             it->iAuthorizationRequestTimeOut,
   1708                             cmdContextData);
   1709                     OSCL_ASSERT(usageContext);
   1710                     if (!usageContext)
   1711                     {
   1712                         return PVMFFailure;
   1713                     }
   1714                     usageContext->iNumAuthorizeRequestsPending++;
   1715                 }
   1716                 else
   1717                 {
   1718                     return PVMFErrNoMemory;
   1719                 }
   1720             }
   1721         }
   1722         return PVMFSuccess;
   1723     }
   1724     /* No active plugins */
   1725     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::RequestApprovalFromActivePlugIns - No Active Plugins"));
   1726     return PVMFFailure;
   1727 }
   1728 
   1729 void PVMFCPMImpl::CompleteApproveUsage(CPMContentUsageContext* aContext)
   1730 {
   1731     if (aContext == NULL)
   1732     {
   1733         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteApproveUsage - Invalid Usage ID"));
   1734         CommandComplete(iCurrentCommand,
   1735                         iCurrentCommand.front(),
   1736                         PVMFFailure);
   1737     }
   1738     else
   1739     {
   1740         aContext->iNumAuthorizeRequestsComplete++;
   1741 
   1742         if (aContext->iNumAuthorizeRequestsComplete ==
   1743                 aContext->iNumAuthorizeRequestsPending)
   1744         {
   1745             if (CheckForMetaDataInterfaceAvailability())
   1746             {
   1747                 PVMFStatus status = QueryForMetaDataKeys(iCurrentCommand.front());
   1748                 if (status != PVMFSuccess)
   1749                 {
   1750                     CommandComplete(iCurrentCommand,
   1751                                     iCurrentCommand.front(),
   1752                                     status);
   1753                 }
   1754             }
   1755             else
   1756             {
   1757                 // No meta data
   1758                 CommandComplete(iCurrentCommand,
   1759                                 iCurrentCommand.front(),
   1760                                 PVMFSuccess);
   1761             }
   1762         }
   1763     }
   1764     return;
   1765 }
   1766 
   1767 bool PVMFCPMImpl::CheckForMetaDataInterfaceAvailability()
   1768 {
   1769     uint32 num = 0;
   1770     if (iActivePlugInParamsVec.size() > 0)
   1771     {
   1772         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1773         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1774         {
   1775             if (it->iPlugInMetaDataExtensionInterface != NULL)
   1776             {
   1777                 num++;
   1778             }
   1779         }
   1780         if (num > 0)
   1781         {
   1782             return true;
   1783         }
   1784     }
   1785     return false;
   1786 }
   1787 
   1788 PVMFStatus PVMFCPMImpl::QueryForMetaDataKeys(PVMFCPMCommand& aParentCmd)
   1789 {
   1790     if (iActivePlugInParamsVec.size() > 0)
   1791     {
   1792         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1793         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1794         {
   1795             if (it->iPlugInMetaDataExtensionInterface != NULL)
   1796             {
   1797                 PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1798                 if (internalCmd != NULL)
   1799                 {
   1800                     internalCmd->cmd =
   1801                         PVMF_CPM_INTERNAL_GET_PLUGIN_META_DATA_KEYS_CMD;
   1802                     internalCmd->parentCmd = aParentCmd.iCmd;
   1803                     internalCmd->plugInID = it->iPlugInID;
   1804                     OsclAny *cmdContextData =
   1805                         OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1806 
   1807                     it->iNumMetaDataKeysAvailable  = 0;
   1808                     it->iAvailableMetadataKeys.clear();
   1809 
   1810                     it->iNumMetaDataKeysAvailable =
   1811                         it->iPlugInMetaDataExtensionInterface->GetNumMetadataKeys();
   1812                     it->iPlugInMetaDataExtensionInterface->GetNodeMetadataKeys(it->iPlugInSessionID,
   1813                             it->iAvailableMetadataKeys,
   1814                             0,
   1815                             it->iNumMetaDataKeysAvailable,
   1816                             NULL,
   1817                             cmdContextData);
   1818                 }
   1819                 else
   1820                 {
   1821                     return PVMFErrNoMemory;
   1822                 }
   1823             }
   1824             else
   1825             {
   1826                 it->iGetMetaDataKeysComplete = true;
   1827             }
   1828         }
   1829         return PVMFSuccess;
   1830     }
   1831     /* No active plugins */
   1832     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::QueryForMetaDataKeys - No Active Plugins"));
   1833     return PVMFFailure;
   1834 }
   1835 
   1836 void PVMFCPMImpl::CompleteGetMetaDataKeys(uint32 aPlugInID)
   1837 {
   1838     CPMPlugInParams* pluginInParams = LookUpPlugInParamsFromActiveList(aPlugInID);
   1839     if (pluginInParams == NULL)
   1840     {
   1841         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteGetMetaDataKeys - Invalid PlugIn ID"));
   1842         CommandComplete(iCurrentCommand,
   1843                         iCurrentCommand.front(),
   1844                         PVMFFailure);
   1845     }
   1846     else
   1847     {
   1848         pluginInParams->iGetMetaDataKeysComplete = true;
   1849         if (CheckForGetMetaDataKeysCompletion())
   1850         {
   1851             PVMFStatus status = PVMFSuccess;
   1852             if (iGetMetaDataKeysInProgress == true)
   1853             {
   1854                 status = CompleteDoGetMetadataKeys(iCurrentCommand.front());
   1855             }
   1856             CommandComplete(iCurrentCommand,
   1857                             iCurrentCommand.front(),
   1858                             status);
   1859             iGetMetaDataKeysFromPlugInsDone = true;
   1860         }
   1861     }
   1862     return;
   1863 }
   1864 
   1865 bool PVMFCPMImpl::CheckForGetMetaDataKeysCompletion()
   1866 {
   1867     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1868     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1869     {
   1870         if (it->iPlugInMetaDataExtensionInterface != NULL)
   1871         {
   1872             if (it->iGetMetaDataKeysComplete == false)
   1873             {
   1874                 return false;
   1875             }
   1876         }
   1877     }
   1878     return true;
   1879 }
   1880 
   1881 
   1882 void PVMFCPMImpl::DoUsageComplete(PVMFCPMCommand& aCmd)
   1883 {
   1884     OsclAny* placeHolder1;
   1885     OsclAny* placeHolder2;
   1886     OsclAny* placeHolder3;
   1887     OsclAny* temp = NULL;
   1888 
   1889     aCmd.Parse(OSCL_STATIC_CAST(OsclAny*&, placeHolder1),
   1890                OSCL_STATIC_CAST(OsclAny*&, placeHolder2),
   1891                temp,
   1892                OSCL_STATIC_CAST(OsclAny*&, placeHolder3));
   1893 
   1894     PVMFCPMUsageID* usageID = OSCL_STATIC_CAST(PVMFCPMUsageID*, temp);
   1895 
   1896     PVMFStatus status = SendUsageCompleteToRegisteredPlugIns(*usageID);
   1897     if (status == PVMFSuccess)
   1898     {
   1899         MoveCmdToCurrentQueue(aCmd);
   1900     }
   1901     else
   1902     {
   1903         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoUsageComplete - SendUsageCompleteToRegisteredPlugIns Failed"));
   1904         CommandComplete(iInputCommands, aCmd, status);
   1905     }
   1906 }
   1907 
   1908 PVMFStatus PVMFCPMImpl::SendUsageCompleteToRegisteredPlugIns(PVMFCPMUsageID aID)
   1909 {
   1910     if (iActivePlugInParamsVec.size() > 0)
   1911     {
   1912         CPMContentUsageContext* usageContext = LookUpContentUsageContext(aID);
   1913         if (usageContext != NULL)
   1914         {
   1915             Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   1916             for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   1917             {
   1918                 PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   1919                 if (internalCmd != NULL)
   1920                 {
   1921                     internalCmd->cmd = PVMF_CPM_INTERNAL_USAGE_COMPLETE_CMD;
   1922                     internalCmd->parentCmd = PVMF_CPM_USAGE_COMPLETE;
   1923                     internalCmd->plugInID = it->iPlugInID;
   1924                     internalCmd->usageid = aID;
   1925                     OsclAny *cmdContextData =
   1926                         OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   1927 
   1928                     it->iPlugInAuthorizationInterface->UsageComplete(it->iPlugInSessionID,
   1929                             cmdContextData);
   1930                     usageContext->iNumUsageCompleteRequestsPending++;
   1931                 }
   1932                 else
   1933                 {
   1934                     return PVMFErrNoMemory;
   1935                 }
   1936             }
   1937             return PVMFSuccess;
   1938         }
   1939         else
   1940         {
   1941             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::SendUsageCompleteToRegisteredPlugIns - Invalid UsageContext"));
   1942             return PVMFFailure;
   1943         }
   1944     }
   1945     /* No active plugins */
   1946     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::SendUsageCompleteToRegisteredPlugIns - No Active Plugins"));
   1947     return PVMFFailure;
   1948 }
   1949 
   1950 void PVMFCPMImpl::CompleteUsageComplete(CPMContentUsageContext* aContext)
   1951 {
   1952     if (aContext == NULL)
   1953     {
   1954         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteUsageComplete - Invalid Usage ID"));
   1955         CommandComplete(iCurrentCommand,
   1956                         iCurrentCommand.front(),
   1957                         PVMFFailure);
   1958     }
   1959     else
   1960     {
   1961         aContext->iNumUsageCompleteRequestsComplete++;
   1962 
   1963         if (aContext->iNumUsageCompleteRequestsComplete ==
   1964                 aContext->iNumUsageCompleteRequestsPending)
   1965         {
   1966             CommandComplete(iCurrentCommand,
   1967                             iCurrentCommand.front(),
   1968                             PVMFSuccess);
   1969         }
   1970     }
   1971     return;
   1972 }
   1973 
   1974 void PVMFCPMImpl::DoCloseSession(PVMFCPMCommand& aCmd)
   1975 {
   1976     OsclAny* temp = NULL;
   1977     aCmd.Parse(temp);
   1978     PVMFSessionId* sessionId = OSCL_STATIC_CAST(PVMFSessionId*, temp);
   1979 
   1980     CPMSessionInfo* sessionInfo = NULL;
   1981 
   1982     Oscl_Vector<CPMSessionInfo, OsclMemAllocator>::iterator it;
   1983     for (it = iListofActiveSessions.begin(); it != iListofActiveSessions.end(); it++)
   1984     {
   1985         if (it->iSessionId == *sessionId)
   1986         {
   1987             sessionInfo = it;
   1988             break;
   1989         }
   1990     }
   1991     if (sessionInfo == NULL)
   1992     {
   1993         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoCloseSession - Invalid Session ID"));
   1994         CommandComplete(iInputCommands, aCmd, PVMFErrArgument);
   1995         return;
   1996     }
   1997     iListofActiveSessions.erase(it);
   1998     CommandComplete(iInputCommands, aCmd, PVMFSuccess);
   1999     return;
   2000 }
   2001 
   2002 void PVMFCPMImpl::DoReset(PVMFCPMCommand& aCmd)
   2003 {
   2004     PVMFStatus status = ResetRegisteredPlugIns();
   2005     if (status == PVMFSuccess)
   2006     {
   2007         MoveCmdToCurrentQueue(aCmd);
   2008     }
   2009     else
   2010     {
   2011         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoReset - ResetRegisteredPlugIns Failed"));
   2012         CommandComplete(iInputCommands, aCmd, status);
   2013     }
   2014     iNumRegisteredPlugInInitPending = 0;
   2015     iNumRegisteredPlugInInitComplete = 0;
   2016     iNumQueryMetaDataExtensionInterfacePending = 0;
   2017     iNumQueryMetaDataExtensionInterfaceComplete = 0;
   2018 
   2019     iGetMetaDataKeysFromPlugInsDone = false;
   2020     iGetMetaDataKeysInProgress = false;
   2021 
   2022 }
   2023 
   2024 PVMFStatus PVMFCPMImpl::ResetRegisteredPlugIns()
   2025 {
   2026     if (iPlugInParamsVec.size() > 0)
   2027     {
   2028         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2029         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   2030         {
   2031             /* Get Authentication interface */
   2032             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   2033             if (internalCmd != NULL)
   2034             {
   2035                 internalCmd->cmd = PVMF_CPM_INTERNAL_RESET_CMD;
   2036                 internalCmd->parentCmd = PVMF_CPM_RESET;
   2037                 internalCmd->plugInID = it->iPlugInID;
   2038                 OsclAny *cmdContextData =
   2039                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   2040 
   2041                 it->iPlugInInterface->Reset(it->iPlugInSessionID,
   2042                                             cmdContextData);
   2043                 iNumRegisteredPlugInResetPending++;
   2044             }
   2045             else
   2046             {
   2047                 return PVMFErrNoMemory;
   2048             }
   2049         }
   2050         return PVMFSuccess;
   2051     }
   2052     /* No registered plugins */
   2053     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::ResetRegisteredPlugIns - Registered plugin list empty"));
   2054     return PVMFFailure;
   2055 }
   2056 
   2057 void PVMFCPMImpl::CompleteCPMReset()
   2058 {
   2059     if (iNumRegisteredPlugInResetPending ==
   2060             iNumRegisteredPlugInResetComplete)
   2061     {
   2062         /* Disonnect from all plugins */
   2063         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2064         for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   2065         {
   2066             if (it->iConnected)
   2067                 it->iPlugInInterface->Disconnect(it->iPlugInSessionID);
   2068             it->iConnected = false;
   2069         }
   2070         CommandComplete(iCurrentCommand,
   2071                         iCurrentCommand.front(),
   2072                         PVMFSuccess);
   2073     }
   2074 }
   2075 
   2076 void PVMFCPMImpl::DoQueryInterface(PVMFCPMCommand& aCmd)
   2077 {
   2078     PVUuid* uuid;
   2079     PVInterface** ptr;
   2080     aCmd.PVMFCPMCommandBase::Parse(uuid, ptr);
   2081 
   2082     PVMFStatus status = PVMFErrNotSupported;
   2083     PVInterface* iFace = NULL;
   2084     if (queryInterface(*uuid, iFace))
   2085     {
   2086         status = PVMFSuccess;
   2087         *ptr = OSCL_STATIC_CAST(PVInterface*, iFace);
   2088     }
   2089     CommandComplete(iInputCommands, aCmd, status);
   2090     return;
   2091 }
   2092 
   2093 void PVMFCPMImpl::Run()
   2094 {
   2095     /*
   2096      * Process commands.
   2097      */
   2098     if (!iInputCommands.empty())
   2099     {
   2100         ProcessCommand(iInputCommands.front());
   2101     }
   2102 }
   2103 
   2104 void PVMFCPMImpl::CPMPluginCommandCompleted(const PVMFCmdResp& aResponse)
   2105 {
   2106     PVMFCPMCommandContext *cmdContextData =
   2107         OSCL_REINTERPRET_CAST(PVMFCPMCommandContext*, aResponse.GetContext());
   2108 
   2109     cmdContextData->oFree = true;
   2110 
   2111     if (cmdContextData->cmd == PVMF_CPM_INTERNAL_CANCEL_GET_LICENSE)
   2112     {
   2113         PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::CompleteCancelGetLicense - status=%d", aResponse.GetCmdStatus()));
   2114         CommandComplete(iCancelCommand,
   2115                         iCancelCommand.front(),
   2116                         aResponse.GetCmdStatus());
   2117         return;
   2118     }
   2119     if (aResponse.GetCmdStatus() != PVMFSuccess)
   2120     {
   2121         if (((cmdContextData->cmd == PVMF_CPM_INTERNAL_QUERY_METADATA_EXTENSION_INTERFACE_CMD) ||
   2122                 (cmdContextData->cmd == PVMF_CPM_INTERNAL_QUERY_CAP_CONFIG_INTERFACE_CMD) ||
   2123                 (cmdContextData->cmd == PVMF_CPM_INTERNAL_QUERY_LICENSE_INTERFACE_CMD)) &&
   2124                 (aResponse.GetCmdStatus() == PVMFErrNotSupported))
   2125         {
   2126             /*
   2127              * Do nothing - Not all plugins have to support:
   2128              * metadata, license interface
   2129              */
   2130         }
   2131         else
   2132         {
   2133             /*
   2134              * This call is in response to a command issued by CPM to one
   2135              * of its plugins. This also means that there is current
   2136              * command in the iCurrentCommand queue blocking the command loop
   2137              * waiting for the all plugin commands to complete. Report failure
   2138              * on it in case the parent id of this command is same as that of
   2139              * the current blocking command. In case more than one child node
   2140              * report error on same parent command, then the first one to
   2141              * report would report failure on the parent command, and subsequent
   2142              * ones would just log errors and return.
   2143              */
   2144             if (iCurrentCommand.size() > 0)
   2145             {
   2146                 if (cmdContextData->parentCmd == iCurrentCommand.front().iCmd)
   2147                 {
   2148                     /* pass up any extra error info, if any */
   2149                     CommandComplete(iCurrentCommand,
   2150                                     iCurrentCommand.front(),
   2151                                     aResponse.GetCmdStatus(),
   2152                                     aResponse.GetEventExtensionInterface());
   2153                     return;
   2154                 }
   2155             }
   2156         }
   2157     }
   2158 
   2159     switch (cmdContextData->cmd)
   2160     {
   2161         case PVMF_CPM_INTERNAL_INIT_CMD:
   2162             iNumRegisteredPlugInInitComplete++;
   2163             CompleteInitPlugIns();
   2164             break;
   2165 
   2166         case PVMF_CPM_INTERNAL_QUERY_METADATA_EXTENSION_INTERFACE_CMD:
   2167         {
   2168             CPMPlugInParams* plugInParams =
   2169                 LookUpPlugInParams(cmdContextData->plugInID);
   2170             if (plugInParams)
   2171             {
   2172                 plugInParams->iPlugInMetaDataExtensionInterface =
   2173                     OSCL_STATIC_CAST(PVMFMetadataExtensionInterface*,
   2174                                      plugInParams->iPlugInMetaDataExtensionInterfacePVI);
   2175                 plugInParams->iPlugInMetaDataExtensionInterfacePVI = NULL;
   2176             }
   2177             iNumQueryMetaDataExtensionInterfaceComplete++;
   2178             CompleteMetaDataExtInterfaceQueryFromPlugIns();
   2179         }
   2180         break;
   2181 
   2182         case PVMF_CPM_INTERNAL_QUERY_AUTHENTICATION_INTERFACE_CMD:
   2183         {
   2184             CPMPlugInParams* plugInParams =
   2185                 LookUpPlugInParams(cmdContextData->plugInID);
   2186             if (plugInParams)
   2187             {
   2188                 plugInParams->iPlugInAuthenticationInterface =
   2189                     OSCL_STATIC_CAST(PVMFCPMPluginAuthenticationInterface*,
   2190                                      plugInParams->iPlugInAuthenticationInterfacePVI);
   2191                 plugInParams->iPlugInAuthenticationInterfacePVI = NULL;
   2192             }
   2193             iNumQueryAuthenticationInterfaceComplete++;
   2194             CompleteCPMInit();
   2195         }
   2196         break;
   2197 
   2198         case PVMF_CPM_INTERNAL_AUTHENTICATE_CMD:
   2199         {
   2200             CPMSessionInfo* sessionInfo =
   2201                 LookUpSessionInfo(cmdContextData->sessionid);
   2202             CompleteOpenSession(sessionInfo);
   2203         }
   2204         break;
   2205 
   2206         case PVMF_CPM_INTERNAL_QUERY_AUTHORIZATION_INTERFACE_CMD:
   2207         {
   2208             CPMPlugInParams* plugInParams =
   2209                 LookUpPlugInParamsFromActiveList(cmdContextData->plugInID);
   2210             if (plugInParams)
   2211             {
   2212                 plugInParams->iPlugInAuthorizationInterface =
   2213                     OSCL_STATIC_CAST(PVMFCPMPluginAuthorizationInterface*,
   2214                                      plugInParams->iPlugInAuthorizationInterfacePVI);
   2215                 plugInParams->iPlugInAuthorizationInterfacePVI = NULL;
   2216             }
   2217             CPMSessionInfo* sessionInfo =
   2218                 LookUpSessionInfo(cmdContextData->sessionid);
   2219             CompleteRegisterContentPhase1(sessionInfo);
   2220         }
   2221         break;
   2222 
   2223         case PVMF_CPM_INTERNAL_QUERY_ACCESS_INTERFACE_FACTORY_CMD:
   2224         {
   2225             CPMPlugInParams* plugInParams =
   2226                 LookUpPlugInParamsFromActiveList(cmdContextData->plugInID);
   2227             if (plugInParams)
   2228             {
   2229                 plugInParams->iPlugInAccessInterfaceFactory =
   2230                     OSCL_STATIC_CAST(PVMFCPMPluginAccessInterfaceFactory*,
   2231                                      plugInParams->iPlugInAccessInterfaceFactoryPVI);
   2232                 plugInParams->iPlugInAccessInterfaceFactoryPVI = NULL;
   2233             }
   2234             CPMSessionInfo* sessionInfo =
   2235                 LookUpSessionInfo(cmdContextData->sessionid);
   2236             CompleteRegisterContentPhase2(sessionInfo);
   2237         }
   2238         break;
   2239 
   2240         case PVMF_CPM_INTERNAL_QUERY_LICENSE_INTERFACE_CMD:
   2241         {
   2242             CPMPlugInParams* plugInParams =
   2243                 LookUpPlugInParamsFromActiveList(cmdContextData->plugInID);
   2244             if (plugInParams)
   2245             {
   2246                 plugInParams->iPlugInLicenseInterface =
   2247                     OSCL_STATIC_CAST(PVMFCPMPluginLicenseInterface*,
   2248                                      plugInParams->iPlugInLicenseInterfacePVI);
   2249                 plugInParams->iPlugInLicenseInterfacePVI = NULL;
   2250             }
   2251             CPMSessionInfo* sessionInfo =
   2252                 LookUpSessionInfo(cmdContextData->sessionid);
   2253             CompleteRegisterContentPhase3(sessionInfo);
   2254         }
   2255         break;
   2256 
   2257         case PVMF_CPM_INTERNAL_AUTHORIZE_CMD:
   2258         {
   2259             CPMContentUsageContext* usageContext =
   2260                 LookUpContentUsageContext(cmdContextData->usageid);
   2261             CompleteApproveUsage(usageContext);
   2262             CPMPlugInParams* plugInParams =
   2263                 LookUpPlugInParams(cmdContextData->plugInID);
   2264             if (plugInParams)
   2265                 plugInParams->iAuthorized = true;
   2266         }
   2267         break;
   2268 
   2269         case PVMF_CPM_INTERNAL_USAGE_COMPLETE_CMD:
   2270         {
   2271             CPMContentUsageContext* usageContext =
   2272                 LookUpContentUsageContext(cmdContextData->usageid);
   2273             CompleteUsageComplete(usageContext);
   2274             CPMPlugInParams* plugInParams =
   2275                 LookUpPlugInParams(cmdContextData->plugInID);
   2276             if (plugInParams)
   2277                 plugInParams->iAuthorized = false;
   2278         }
   2279         break;
   2280 
   2281         case PVMF_CPM_INTERNAL_RESET_CMD:
   2282             iNumRegisteredPlugInResetComplete++;
   2283             CompleteCPMReset();
   2284             break;
   2285 
   2286         case PVMF_CPM_INTERNAL_GET_PLUGIN_META_DATA_KEYS_CMD:
   2287             CompleteGetMetaDataKeys(cmdContextData->plugInID);
   2288             break;
   2289 
   2290         case PVMF_CPM_INTERNAL_GET_PLUGIN_META_DATA_VALUES_CMD:
   2291         {
   2292             CompleteGetMetaDataValues(cmdContextData);
   2293         }
   2294         break;
   2295 
   2296         case PVMF_CPM_INTERNAL_GET_LICENSE_CMD:
   2297         {
   2298             CompleteGetLicense();
   2299         }
   2300         break;
   2301 
   2302         case PVMF_CPM_INTERNAL_QUERY_CAP_CONFIG_INTERFACE_CMD:
   2303         {
   2304             CPMPlugInParams* plugInParams =
   2305                 LookUpPlugInParams(cmdContextData->plugInID);
   2306             if (plugInParams)
   2307             {
   2308                 plugInParams->iPlugInCapConfigExtensionInterface =
   2309                     OSCL_STATIC_CAST(PvmiCapabilityAndConfig*,
   2310                                      plugInParams->iPlugInCapConfigExtensionInterfacePVI);
   2311                 plugInParams->iPlugInCapConfigExtensionInterfacePVI = NULL;
   2312             }
   2313             iNumQueryCapConfigExtensionInterfaceComplete++;
   2314             CompleteCapConfigExtInterfaceQueryFromPlugIns();
   2315         }
   2316         break;
   2317 
   2318         default:
   2319             break;
   2320     }
   2321     return;
   2322 }
   2323 
   2324 CPMSessionInfo*
   2325 PVMFCPMImpl::LookUpSessionInfo(PVMFSessionId aID)
   2326 {
   2327     Oscl_Vector<CPMSessionInfo, OsclMemAllocator>::iterator it;
   2328     for (it = iListofActiveSessions.begin(); it != iListofActiveSessions.end(); it++)
   2329     {
   2330         if (it->iSessionId == aID)
   2331         {
   2332             return (it);
   2333         }
   2334     }
   2335     return NULL;
   2336 }
   2337 
   2338 CPMContentUsageContext* PVMFCPMImpl::LookUpContentUsageContext(PVMFCPMUsageID aID)
   2339 {
   2340     Oscl_Vector<CPMContentUsageContext, OsclMemAllocator>::iterator it;
   2341     for (it = iContentUsageContextVec.begin(); it != iContentUsageContextVec.end(); it++)
   2342     {
   2343         if (it->iUsageID == aID)
   2344         {
   2345             return (it);
   2346         }
   2347     }
   2348     return NULL;
   2349 }
   2350 
   2351 CPMPlugInParams* PVMFCPMImpl::LookUpPlugInParams(uint32 aID)
   2352 {
   2353     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2354     for (it = iPlugInParamsVec.begin(); it != iPlugInParamsVec.end(); it++)
   2355     {
   2356         if (it->iPlugInID == aID)
   2357         {
   2358             return (it);
   2359         }
   2360     }
   2361     return NULL;
   2362 }
   2363 
   2364 CPMPlugInParams* PVMFCPMImpl::LookUpPlugInParamsFromActiveList(uint32 aID)
   2365 {
   2366     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2367     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2368     {
   2369         if (it->iPlugInID == aID)
   2370         {
   2371             return (it);
   2372         }
   2373     }
   2374     return NULL;
   2375 }
   2376 
   2377 OSCL_EXPORT_REF uint32
   2378 PVMFCPMImpl::GetNumMetadataKeys(char* aQueryKeyString)
   2379 {
   2380     uint32 numMetaDataKeys = 0;
   2381     if (iActivePlugInParamsVec.size() > 0)
   2382     {
   2383         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2384         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2385         {
   2386             if (NULL != it->iPlugInMetaDataExtensionInterface)
   2387             {
   2388                 numMetaDataKeys +=
   2389                     it->iPlugInMetaDataExtensionInterface->GetNumMetadataKeys(aQueryKeyString);
   2390             }
   2391         }
   2392         return numMetaDataKeys;
   2393     }
   2394     /* No active plugins */
   2395     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::GetNumMetadataKeys - No Active Plugins"));
   2396     return numMetaDataKeys;
   2397 }
   2398 
   2399 OSCL_EXPORT_REF uint32
   2400 PVMFCPMImpl::GetNumMetadataValues(PVMFMetadataList& aKeyList)
   2401 {
   2402     uint32 numMetaDataValues = 0;
   2403     if (iActivePlugInParamsVec.size() > 0)
   2404     {
   2405         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2406         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2407         {
   2408             if (NULL != it->iPlugInMetaDataExtensionInterface)
   2409             {
   2410                 numMetaDataValues +=
   2411                     it->iPlugInMetaDataExtensionInterface->GetNumMetadataValues(aKeyList);
   2412             }
   2413         }
   2414         return numMetaDataValues;
   2415     }
   2416     /* No active plugins */
   2417     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::GetNumMetadataValues - No Active Plugins"));
   2418     return numMetaDataValues;
   2419 }
   2420 
   2421 PVMFStatus
   2422 PVMFCPMImpl::DoGetMetadataKeys(PVMFCPMCommand& aCmd)
   2423 {
   2424     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::DoGetMetadataKeys Called"));
   2425     if (iActivePlugInParamsVec.size() == 0)
   2426     {
   2427         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataKeys - No Active Plugins"));
   2428         return PVMFErrInvalidState;
   2429     }
   2430 
   2431     iGetMetaDataKeysInProgress = true;
   2432 
   2433     if (iGetMetaDataKeysFromPlugInsDone == false)
   2434     {
   2435         if (CheckForMetaDataInterfaceAvailability())
   2436         {
   2437             PVMFStatus status = QueryForMetaDataKeys(aCmd);
   2438             if (status != PVMFSuccess)
   2439             {
   2440                 PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataKeys - QueryForMetaDataKeys Failed"));
   2441                 return status;
   2442             }
   2443             return PVMFPending;
   2444         }
   2445     }
   2446     return (CompleteDoGetMetadataKeys(aCmd));
   2447 }
   2448 PVMFStatus
   2449 PVMFCPMImpl::CompleteDoGetMetadataKeys(PVMFCPMCommand& aCmd)
   2450 {
   2451     iGetMetaDataKeysInProgress = false;
   2452 
   2453     int32 leavecode = OsclErrNone;
   2454     PVMFMetadataList* keylistptr = NULL;
   2455     int32 starting_index;
   2456     int32 max_entries;
   2457     char* query_key = NULL;
   2458     aCmd.PVMFCPMCommand::Parse(keylistptr,
   2459                                starting_index,
   2460                                max_entries,
   2461                                query_key);
   2462 
   2463     /* Check parameters */
   2464     if ((keylistptr == NULL) ||
   2465             (starting_index < 0)  ||
   2466             (max_entries == 0))
   2467     {
   2468         /* Invalid starting index and/or max entries */
   2469         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteDoGetMetadataKeys - Invalid Args"));
   2470         return PVMFErrArgument;
   2471     }
   2472 
   2473     /* Copy the requested keys from all active plugins */
   2474     uint32 num_entries = 0;
   2475     int32 num_added = 0;
   2476     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2477     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2478     {
   2479         it->iMetaDataKeyStartIndex = keylistptr->size();
   2480         for (uint32 lcv = 0; lcv < it->iAvailableMetadataKeys.size(); lcv++)
   2481         {
   2482             if (query_key == NULL)
   2483             {
   2484                 /* No query key so this key is counted */
   2485                 ++num_entries;
   2486                 if (num_entries > (uint32)starting_index)
   2487                 {
   2488                     /* Past the starting index so copy the key */
   2489                     leavecode = OsclErrNone;
   2490                     leavecode = PushKVPKey(it->iAvailableMetadataKeys[lcv], *keylistptr);
   2491                     if (OsclErrNone != leavecode)
   2492                     {
   2493                         return PVMFErrNoMemory;
   2494                     }
   2495                     num_added++;
   2496                 }
   2497             }
   2498             else
   2499             {
   2500                 /* Check if the key matches the query key */
   2501                 if (pv_mime_strcmp((char*)it->iAvailableMetadataKeys[lcv].get_cstr(), query_key) >= 0)
   2502                 {
   2503                     /* This key is counted */
   2504                     ++num_entries;
   2505                     if (num_entries > (uint32)starting_index)
   2506                     {
   2507                         /* Past the starting index so copy the key */
   2508                         leavecode = OsclErrNone;
   2509                         leavecode = PushKVPKey(it->iAvailableMetadataKeys[lcv], *keylistptr);
   2510                         if (OsclErrNone != leavecode)
   2511                         {
   2512                             return PVMFErrNoMemory;
   2513                         }
   2514                         num_added++;
   2515                     }
   2516                 }
   2517             }
   2518             /* Check if max number of entries have been copied */
   2519             if ((max_entries > 0) && (num_added >= max_entries))
   2520             {
   2521                 break;
   2522             }
   2523         }
   2524         it->iMetaDataValueEndIndex = keylistptr->size();
   2525     }
   2526     return PVMFSuccess;
   2527 }
   2528 
   2529 void
   2530 PVMFCPMImpl::DoGetMetadataValues(PVMFCPMCommand& aCmd)
   2531 {
   2532     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::DoGetMetadataValues Called"));
   2533     MoveCmdToCurrentQueue(aCmd);
   2534 
   2535     if (iActivePlugInParamsVec.size() == 0)
   2536     {
   2537         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataValues - No Active Plugins"));
   2538         CommandComplete(iCurrentCommand,
   2539                         iCurrentCommand.front(),
   2540                         PVMFErrInvalidState);
   2541         return;
   2542     }
   2543 
   2544     iKeyListPtr = NULL;
   2545     iValueListPtr = NULL;
   2546     iGetMetaDataValuesStartingIndex = 0;
   2547     iGetMetaDataValuesMaxEntries = 0;
   2548 
   2549 
   2550     aCmd.PVMFCPMCommand::Parse(iKeyListPtr,
   2551                                iValueListPtr,
   2552                                iGetMetaDataValuesStartingIndex,
   2553                                iGetMetaDataValuesMaxEntries);
   2554 
   2555     /* Check the parameters */
   2556     if (iKeyListPtr == NULL || iValueListPtr == NULL)
   2557     {
   2558         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataValues - Null Args"));
   2559         CommandComplete(iCurrentCommand,
   2560                         iCurrentCommand.front(),
   2561                         PVMFErrArgument);
   2562         return;
   2563     }
   2564 
   2565     uint32 numkeys = iKeyListPtr->size();
   2566 
   2567     if ((iGetMetaDataValuesStartingIndex < 0) ||
   2568             (iGetMetaDataValuesStartingIndex > (int32)(numkeys - 1)) ||
   2569             ((int32)numkeys <= 0) ||
   2570             (iGetMetaDataValuesMaxEntries == 0))
   2571     {
   2572         /* Don't do anything */
   2573         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataValues - Invalid Args"));
   2574         CommandComplete(iCurrentCommand,
   2575                         iCurrentCommand.front(),
   2576                         PVMFErrArgument);
   2577         return;
   2578     }
   2579 
   2580     if (iActivePlugInParamsVec.size() > 0)
   2581     {
   2582         if (IsGetMetaDataValuesFromPlugInsComplete() == false)
   2583         {
   2584             CPMPlugInParams* plugInParams =
   2585                 LookUpNextPlugInForGetMetaDataValues();
   2586 
   2587             SendGetMetaDataValuesToPlugIn(plugInParams);
   2588             return;
   2589         }
   2590         else
   2591         {
   2592             PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::DoGetMetadataValues - No Active Plugins With MetaData Support"));
   2593             CommandComplete(iCurrentCommand,
   2594                             iCurrentCommand.front(),
   2595                             PVMFSuccess);
   2596             return;
   2597         }
   2598     }
   2599     /* No active plugins */
   2600     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetMetadataValues - No Active Plugins"));
   2601     CommandComplete(iCurrentCommand,
   2602                     iCurrentCommand.front(),
   2603                     PVMFFailure);
   2604     return;
   2605 }
   2606 
   2607 CPMPlugInParams* PVMFCPMImpl::LookUpNextPlugInForGetMetaDataValues()
   2608 {
   2609     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2610     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2611     {
   2612         if (it->iGetMetaDataValuesComplete == false)
   2613         {
   2614             return (it);
   2615         }
   2616     }
   2617     return NULL;
   2618 }
   2619 
   2620 bool PVMFCPMImpl::IsGetMetaDataValuesFromPlugInsComplete()
   2621 {
   2622     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2623     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2624     {
   2625         if (it->iPlugInMetaDataExtensionInterface == NULL)
   2626         {
   2627             /* No metadata ext intf - so treat it as complete */
   2628             it->iGetMetaDataValuesComplete = true;
   2629         }
   2630         else
   2631         {
   2632             if (it->iGetMetaDataValuesComplete == false)
   2633             {
   2634                 return false;
   2635             }
   2636         }
   2637     }
   2638     return true;
   2639 }
   2640 
   2641 void
   2642 PVMFCPMImpl::SendGetMetaDataValuesToPlugIn(CPMPlugInParams* aParams)
   2643 {
   2644     if (aParams != NULL)
   2645     {
   2646         PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   2647         if (internalCmd != NULL)
   2648         {
   2649             internalCmd->cmd =
   2650                 PVMF_CPM_INTERNAL_GET_PLUGIN_META_DATA_VALUES_CMD;
   2651             internalCmd->parentCmd = PVMF_CPM_GET_METADATA_VALUES;
   2652             internalCmd->plugInID = aParams->iPlugInID;
   2653             OsclAny *cmdContextData =
   2654                 OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   2655 
   2656             aParams->iNumMetaDataValuesAvailable =
   2657                 aParams->iPlugInMetaDataExtensionInterface->GetNumMetadataValues((PVMFMetadataList&)(*iKeyListPtr));
   2658             aParams->iMetaDataValueStartIndex = iValueListPtr->size();
   2659             aParams->iPlugInMetaDataExtensionInterface->GetNodeMetadataValues(aParams->iPlugInSessionID,
   2660                     (PVMFMetadataList&)(*iKeyListPtr),
   2661                     (Oscl_Vector<PvmiKvp, OsclMemAllocator>&)(*iValueListPtr),
   2662                     0,
   2663                     aParams->iNumMetaDataValuesAvailable,
   2664                     cmdContextData);
   2665         }
   2666         else
   2667         {
   2668             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::RequestMetaDataValues - SendGetMetaDataValuesToPlugIn Failed"));
   2669             CommandComplete(iCurrentCommand,
   2670                             iCurrentCommand.front(),
   2671                             PVMFErrNoMemory);
   2672             return;
   2673         }
   2674     }
   2675 }
   2676 
   2677 void
   2678 PVMFCPMImpl::CompleteGetMetaDataValues(PVMFCPMCommandContext* aContext)
   2679 {
   2680     if (iActivePlugInParamsVec.size() > 0)
   2681     {
   2682         CPMPlugInParams* currPlugInParams =
   2683             LookUpPlugInParamsFromActiveList(aContext->plugInID);
   2684         OSCL_ASSERT(currPlugInParams);
   2685         if (!currPlugInParams)
   2686             return; // unlikely: lookup failed.
   2687         currPlugInParams->iMetaDataValueEndIndex = iValueListPtr->size();
   2688         currPlugInParams->iGetMetaDataValuesComplete = true;
   2689 
   2690         if (IsGetMetaDataValuesFromPlugInsComplete() == false)
   2691         {
   2692             CPMPlugInParams* nextPlugInParams =
   2693                 LookUpNextPlugInForGetMetaDataValues();
   2694 
   2695             SendGetMetaDataValuesToPlugIn(nextPlugInParams);
   2696         }
   2697         else
   2698         {
   2699             /* Reset for future retrievals */
   2700             Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2701             for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2702             {
   2703                 it->iGetMetaDataValuesComplete = false;
   2704             }
   2705             CommandComplete(iCurrentCommand,
   2706                             iCurrentCommand.front(),
   2707                             PVMFSuccess);
   2708         }
   2709         return;
   2710     }
   2711     /* No active plugins */
   2712     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::CompleteGetMetaDataValues - No Active Plugins"));
   2713     CommandComplete(iCurrentCommand,
   2714                     iCurrentCommand.front(),
   2715                     PVMFFailure);
   2716     return;
   2717 }
   2718 
   2719 PVMFStatus PVMFCPMImpl::getParametersSync(PvmiMIOSession aSession,
   2720         PvmiKeyType aIdentifier,
   2721         PvmiKvp*& aParameters,
   2722         int& num_parameter_elements,
   2723         PvmiCapabilityContext aContext)
   2724 {
   2725     OSCL_UNUSED_ARG(aSession);
   2726     OSCL_UNUSED_ARG(aIdentifier);
   2727     OSCL_UNUSED_ARG(aParameters);
   2728     OSCL_UNUSED_ARG(num_parameter_elements);
   2729     OSCL_UNUSED_ARG(aContext);
   2730 
   2731     return PVMFErrNotSupported;
   2732 }
   2733 
   2734 
   2735 PVMFStatus PVMFCPMImpl::releaseParameters(PvmiMIOSession aSession,
   2736         PvmiKvp* aParameters,
   2737         int num_elements)
   2738 {
   2739     PVMFStatus status = PVMFFailure;
   2740     if (aParameters)
   2741     {
   2742         Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2743         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2744         {
   2745             if (it->iPlugInCapConfigExtensionInterface != NULL)
   2746             {
   2747                 status =
   2748                     it->iPlugInCapConfigExtensionInterface->releaseParameters(aSession,
   2749                             aParameters,
   2750                             num_elements);
   2751             }
   2752         }
   2753     }
   2754     return status;
   2755 }
   2756 
   2757 
   2758 void PVMFCPMImpl::setParametersSync(PvmiMIOSession aSession,
   2759                                     PvmiKvp* aParameters,
   2760                                     int num_elements,
   2761                                     PvmiKvp*& aRet_kvp)
   2762 {
   2763     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2764     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2765     {
   2766         if (it->iPlugInCapConfigExtensionInterface != NULL)
   2767         {
   2768             int32 err = OsclErrNone;
   2769             OSCL_TRY(err,
   2770                      it->iPlugInCapConfigExtensionInterface->setParametersSync(aSession,
   2771                              aParameters,
   2772                              num_elements,
   2773                              aRet_kvp););
   2774             /* Ignore error - Not all plugins need support all config params */
   2775         }
   2776     }
   2777 }
   2778 
   2779 
   2780 PVMFStatus PVMFCPMImpl::verifyParametersSync(PvmiMIOSession aSession,
   2781         PvmiKvp* aParameters,
   2782         int num_elements)
   2783 {
   2784     PVMFStatus status = PVMFFailure;
   2785     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2786     for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2787     {
   2788         if (it->iPlugInCapConfigExtensionInterface != NULL)
   2789         {
   2790             status =
   2791                 it->iPlugInCapConfigExtensionInterface->verifyParametersSync(aSession,
   2792                         aParameters,
   2793                         num_elements);
   2794         }
   2795     }
   2796     return status;
   2797 }
   2798 PVMFCommandId
   2799 PVMFCPMImpl::GetLicense(PVMFSessionId aSessionId,
   2800                         OSCL_wString& aContentName,
   2801                         OsclAny* aData,
   2802                         uint32 aDataSize,
   2803                         int32 aTimeoutMsec,
   2804                         OsclAny* aContextData)
   2805 {
   2806     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:GetLicense - Wide"));
   2807     PVMFCPMCommand cmd;
   2808     cmd.Construct(aSessionId,
   2809                   PVMF_CPM_GET_LICENSE_W,
   2810                   aContentName,
   2811                   aData,
   2812                   aDataSize,
   2813                   aTimeoutMsec,
   2814                   aContextData);
   2815     return QueueCommandL(cmd);
   2816 }
   2817 
   2818 PVMFCommandId
   2819 PVMFCPMImpl::GetLicense(PVMFSessionId aSessionId,
   2820                         OSCL_String&  aContentName,
   2821                         OsclAny* aData,
   2822                         uint32 aDataSize,
   2823                         int32 aTimeoutMsec,
   2824                         OsclAny* aContextData)
   2825 {
   2826     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:GetLicense"));
   2827     PVMFCPMCommand cmd;
   2828     cmd.Construct(aSessionId,
   2829                   PVMF_CPM_GET_LICENSE,
   2830                   aContentName,
   2831                   aData,
   2832                   aDataSize,
   2833                   aTimeoutMsec,
   2834                   aContextData);
   2835     return QueueCommandL(cmd);
   2836 }
   2837 
   2838 PVMFCommandId
   2839 PVMFCPMImpl::CancelGetLicense(PVMFSessionId aSessionId, PVMFCommandId aCmdId, OsclAny* aContextData)
   2840 {
   2841     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:CancelGetLicense"));
   2842     PVMFCPMCommand cmd;
   2843     cmd.PVMFCPMCommandBase::Construct(aSessionId,
   2844                                       PVMF_CPM_CANCEL_GET_LICENSE,
   2845                                       aCmdId,
   2846                                       aContextData);
   2847     return QueueCommandL(cmd);
   2848 }
   2849 
   2850 PVMFStatus PVMFCPMImpl::GetLicenseStatus(
   2851     PVMFCPMLicenseStatus& aStatus)
   2852 {
   2853     if (iLicenseInterface)
   2854         return iLicenseInterface->GetLicenseStatus(aStatus);
   2855     return PVMFFailure;
   2856 }
   2857 
   2858 PVMFStatus PVMFCPMImpl::DoGetLicense(PVMFCPMCommand& aCmd,
   2859                                      bool aWideCharVersion)
   2860 {
   2861     iLicenseInterface = NULL;
   2862     CPMSessionInfo* sInfo = LookUpSessionInfo(aCmd.iSession);
   2863     CPMPlugInParams* pluginParamsPtr = NULL;
   2864     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2865     if (sInfo != NULL)
   2866     {
   2867         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2868         {
   2869             if (it->iPlugInID == sInfo->iAccessPlugInID)
   2870             {
   2871                 iLicenseInterface = it->iPlugInLicenseInterface;
   2872                 pluginParamsPtr = it;
   2873             }
   2874         }
   2875     }
   2876 
   2877     if (iLicenseInterface == NULL)
   2878     {
   2879         PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetLicense - No License Interface"));
   2880         return PVMFErrNotSupported;
   2881     }
   2882 
   2883     if (aWideCharVersion == true)
   2884     {
   2885         OSCL_wString* contentName = NULL;
   2886         OsclAny* data = NULL;
   2887         uint32 dataSize = 0;
   2888         int32 timeoutMsec = 0;
   2889         aCmd.Parse(contentName,
   2890                    data,
   2891                    dataSize,
   2892                    timeoutMsec);
   2893 
   2894         PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   2895         if (internalCmd != NULL)
   2896         {
   2897             internalCmd->cmd = PVMF_CPM_INTERNAL_GET_LICENSE_CMD;
   2898             internalCmd->parentCmd = PVMF_CPM_GET_LICENSE_W;
   2899             internalCmd->plugInID = pluginParamsPtr->iPlugInID;
   2900             OsclAny *cmdContextData =
   2901                 OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   2902             iGetLicenseCmdId =
   2903                 iLicenseInterface->GetLicense(pluginParamsPtr->iPlugInSessionID,
   2904                                               *contentName,
   2905                                               data,
   2906                                               dataSize,
   2907                                               timeoutMsec,
   2908                                               cmdContextData);
   2909         }
   2910         else
   2911         {
   2912             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetLicense - RequestNewInternalCmd Failed"));
   2913             return PVMFErrNoMemory;
   2914         }
   2915     }
   2916     else
   2917     {
   2918         OSCL_String* contentName = NULL;
   2919         OsclAny* data = NULL;
   2920         uint32 dataSize = 0;
   2921         int32 timeoutMsec = 0;
   2922         aCmd.Parse(contentName,
   2923                    data,
   2924                    dataSize,
   2925                    timeoutMsec);
   2926         PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   2927         if (internalCmd != NULL)
   2928         {
   2929             internalCmd->cmd = PVMF_CPM_INTERNAL_GET_LICENSE_CMD;
   2930             internalCmd->parentCmd = PVMF_CPM_GET_LICENSE;
   2931             internalCmd->plugInID = pluginParamsPtr->iPlugInID;
   2932             OsclAny *cmdContextData =
   2933                 OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   2934             iGetLicenseCmdId =
   2935                 iLicenseInterface->GetLicense(pluginParamsPtr->iPlugInSessionID,
   2936                                               *contentName,
   2937                                               data,
   2938                                               dataSize,
   2939                                               timeoutMsec,
   2940                                               cmdContextData);
   2941         }
   2942         else
   2943         {
   2944             PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoGetLicense - RequestNewInternalCmd Failed"));
   2945             return PVMFErrNoMemory;
   2946         }
   2947     }
   2948     return PVMFPending;
   2949 }
   2950 
   2951 void PVMFCPMImpl::CompleteGetLicense()
   2952 {
   2953     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl::CompleteGetLicense - Success"));
   2954     CommandComplete(iCurrentCommand,
   2955                     iCurrentCommand.front(),
   2956                     PVMFSuccess);
   2957 }
   2958 
   2959 void PVMFCPMImpl::DoCancelGetLicense(PVMFCPMCommand& aCmd)
   2960 {
   2961     PVMF_CPM_LOGINFO((0, "PVMFCPMImpl:DoCancelGetLicense is called"));
   2962     /* extract the command ID from the parameters.*/
   2963     PVMFCommandId id;
   2964     aCmd.PVMFCPMCommandBase::Parse(id);
   2965     PVMFStatus status = PVMFErrArgument;
   2966 
   2967     iLicenseInterface = NULL;
   2968     CPMSessionInfo* sInfo = LookUpSessionInfo(aCmd.iSession);
   2969     CPMPlugInParams* pluginParamsPtr = NULL;
   2970     Oscl_Vector<CPMPlugInParams, OsclMemAllocator>::iterator it;
   2971     if (sInfo != NULL)
   2972     {
   2973         for (it = iActivePlugInParamsVec.begin(); it != iActivePlugInParamsVec.end(); it++)
   2974         {
   2975             if (it->iPlugInID == sInfo->iAccessPlugInID)
   2976             {
   2977                 iLicenseInterface = it->iPlugInLicenseInterface;
   2978                 pluginParamsPtr = it;
   2979             }
   2980         }
   2981     }
   2982 
   2983     /* first check "current" command if any */
   2984     PVMFCPMCommand* cmd = iCurrentCommand.FindById(id);
   2985     if (cmd)
   2986     {
   2987         if (cmd->iCmd == PVMF_CPM_GET_LICENSE_W || cmd->iCmd == PVMF_CPM_GET_LICENSE)
   2988         {
   2989             PVMFCPMCommandContext* internalCmd = RequestNewInternalCmd();
   2990             if (internalCmd != NULL)
   2991             {
   2992                 internalCmd->cmd = PVMF_CPM_INTERNAL_CANCEL_GET_LICENSE;
   2993                 internalCmd->parentCmd = PVMF_CPM_CANCEL_GET_LICENSE;
   2994 
   2995                 OSCL_ASSERT(pluginParamsPtr);
   2996 
   2997                 if (!pluginParamsPtr)
   2998 
   2999                 {
   3000 
   3001                     status = PVMFErrCorrupt;
   3002 
   3003                     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoCancelGetLicense - data corrupted"));
   3004 
   3005                     CommandComplete(iInputCommands, aCmd, status);
   3006 
   3007                     return;
   3008 
   3009                 }
   3010 
   3011                 internalCmd->plugInID = pluginParamsPtr->iPlugInID;
   3012 
   3013                 OsclAny *cmdContextData =
   3014                     OSCL_REINTERPRET_CAST(OsclAny*, internalCmd);
   3015 
   3016                 iLicenseInterface->CancelGetLicense(pluginParamsPtr->iPlugInSessionID, iGetLicenseCmdId, cmdContextData);
   3017 
   3018                 /*
   3019                  * the queued commands are all asynchronous commands to the
   3020                  * CPM module. CancelGetLicense can cancel only for GetLicense cmd.
   3021                  * We need to wait CPMPluginCommandCompleted.
   3022                  */
   3023                 MoveCmdToCancelQueue(aCmd);
   3024                 return;
   3025             }
   3026             else
   3027             {
   3028                 PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoCancelGetLicense - RequestNewInternalCmd Failed"));
   3029                 status = PVMFErrNoMemory;
   3030             }
   3031         }
   3032     }
   3033     PVMF_CPM_LOGERROR((0, "PVMFCPMImpl::DoCancelGetLicense - current cmd is not GetLicense"));
   3034     CommandComplete(iInputCommands, aCmd, status);
   3035     return;
   3036 }
   3037 
   3038 OSCL_EXPORT_REF bool CPMPluginRegistryImpl::addPluginToRegistry(OSCL_String& aMimeType,
   3039         CPMPluginContainer& aPlugInContainer)
   3040 {
   3041     CPMPluginContainer*container = lookupPlugin(aMimeType);
   3042     if (container)
   3043         return false;//duplicate mime type!
   3044     container = OSCL_NEW(CPMPluginContainer, (aPlugInContainer));
   3045     iCPMPluginRegistry.insert(value_type(aMimeType, container));
   3046     iListofPlugInMimeTypes.push_back(aMimeType);
   3047     return true;
   3048 }
   3049 
   3050 OSCL_EXPORT_REF void CPMPluginRegistryImpl::removePluginFromRegistry(OSCL_String& aMimeType)
   3051 {
   3052     CPMPluginContainer*container = lookupPlugin(aMimeType);
   3053     if (container)
   3054     {
   3055         OSCL_DELETE(container);
   3056     }
   3057     for (uint32 i = 0; i < iListofPlugInMimeTypes.size(); i++)
   3058     {
   3059         if (iListofPlugInMimeTypes[i] == aMimeType)
   3060         {
   3061             iListofPlugInMimeTypes.erase(&iListofPlugInMimeTypes[i]);
   3062             iCPMPluginRegistry.erase(iCPMPluginRegistry.find(aMimeType));
   3063         }
   3064     }
   3065 }
   3066 
   3067 OSCL_EXPORT_REF CPMPluginContainer* CPMPluginRegistryImpl::lookupPlugin(OSCL_String& aMimeType)
   3068 {
   3069     Oscl_Map<string_key_type, CPMPluginContainer*, OsclMemAllocator, string_key_compare_class>::iterator it;
   3070     it = iCPMPluginRegistry.find(aMimeType);
   3071 
   3072     /* Workaround for the ADS1.2 compiler*/
   3073     if (!(it == iCPMPluginRegistry.end()))
   3074     {
   3075         return (((*it).second));
   3076     }
   3077     return NULL;
   3078 }
   3079 
   3080 OSCL_EXPORT_REF uint32 CPMPluginRegistryImpl::GetNumPlugIns()
   3081 {
   3082     return (iCPMPluginRegistry.size());
   3083 }
   3084 
   3085 OSCL_EXPORT_REF bool CPMPluginRegistryImpl::GetPluginMimeType(uint32 aIndex, OSCL_String& aMimeType)
   3086 {
   3087     if (aIndex < GetNumPlugIns())
   3088     {
   3089         aMimeType = iListofPlugInMimeTypes[aIndex];
   3090         return true;
   3091     }
   3092     return false;//invalid index.
   3093 }
   3094 
   3095 OSCL_EXPORT_REF CPMPluginRegistryImpl::CPMPluginRegistryImpl()
   3096 {
   3097     iRefCount = 0;
   3098     iSharedLibList = NULL;
   3099 }
   3100 
   3101 #ifdef USE_LOADABLE_MODULES
   3102 #include "oscl_shared_library.h"
   3103 #endif
   3104 
   3105 OSCL_EXPORT_REF CPMPluginRegistryImpl::~CPMPluginRegistryImpl()
   3106 {
   3107     //just in case plugins weren't removed, go through and cleanup
   3108     for (uint32 i = 0; i < iListofPlugInMimeTypes.size(); i++)
   3109     {
   3110         CPMPluginContainer* container = lookupPlugin(iListofPlugInMimeTypes[i]);
   3111         if (container)
   3112             OSCL_DELETE(container);
   3113     }
   3114 #ifdef USE_LOADABLE_MODULES
   3115     if (iSharedLibList)
   3116         OSCL_DELETE(iSharedLibList);
   3117 #endif
   3118 }
   3119 
   3120 CPMPluginRegistry* CPMPluginRegistryFactory::CreateCPMPluginRegistry()
   3121 {
   3122     return (CPMPluginRegistry*)OSCL_NEW(CPMPluginRegistryImpl, ());
   3123 }
   3124 
   3125 void CPMPluginRegistryFactory::DestroyCPMPluginRegistry(CPMPluginRegistry* aReg)
   3126 {
   3127     CPMPluginRegistryImpl* impl = (CPMPluginRegistryImpl*)aReg;
   3128     OSCL_DELETE(impl);
   3129 }
   3130 
   3131 int32 PVMFCPMImpl::PushKVPKey(OSCL_String& aString, PVMFMetadataList& aKeyList)
   3132 {
   3133     int32 leavecode = OsclErrNone;
   3134     OSCL_TRY(leavecode, aKeyList.push_back(aString));
   3135     return leavecode;
   3136 }
   3137