1#include "dmt.hpp" 2 3#include <stdlib.h> 4#include <string> 5#include <map> 6#include <stdio.h> 7 8#include "plugin/dmtPlugin.hpp" 9 10#define Debug printf 11 12/* 13Plugin Ini Format: 14 15 16[./DevDetail/xxx/Node Path] 17constraint=xxxx.so 18 19./DevDetail/interiornode= 20/interiornode/leafnode2= 21 22*/ 23 24extern "C" 25SYNCML_DM_RET_STATUS_T DMT_PluginLib_CheckConstraint( 26 CPCHAR path, //This is the path that matches the ini file parameter 27 DMStringMap& mapParameters, 28 PDmtTree tree //Global Tree with same access rights for current session 29 ) 30{ 31 if (tree == NULL) 32 { 33 //When tree is NULL, means we cannot get session/lock? 34 return (SYNCML_DM_FAIL); 35 } 36 bool nodeExist=false; 37 38#if 0 39 //Test if DmtTree is OK 40 PDmtNode node; 41 PDmtErrorDescription e=tree->GetNode( 42 ".", //const char* path, 43 node //PDmtNode& ptrNode 44 ); 45 if (e!=NULL) 46 { 47 printf( "Can't get node from DmtTree for %s, err=%s\n", ".", (const char*)e->GetErrorText().c_str() ); 48 } 49 nodeExist=tree->IsValidNode("."); 50 Debug( " nodeExist for %s=%d\n", ".", nodeExist ); 51 nodeExist=tree->IsValidNode("./SyncML"); 52 Debug( " nodeExist for %s=%d\n", "./SyncML", nodeExist ); 53 54#endif 55 56 Debug("CheckConstraint for path %s tree=0x%x\n", path, tree.GetPtr() ); 57 58 int numPaths=0; //How many in parameters 59 int numNodes=0; //How many exists 60 61 for ( DMMap<DMString, DMString>::POS it = mapParameters.begin(); it != mapParameters.end(); it++ ) 62 { 63 DMString paramName = mapParameters.get_key( it ); 64 DMString paramValue= mapParameters.get_value( it ); 65 66 const char * pName=paramName.c_str(); 67 68 if (* pName !='.' && * pName !='/' ) 69 continue; 70 71 numPaths++; 72 73 DMString strPath; 74 if (* pName =='.') 75 strPath=paramName; //Absolute path 76 else //(* pName =='/') //Relative path 77 { 78 strPath +=path; 79 if ( (* (pName+1)) !='\0' ) 80 strPath +=pName; // pName already started with "/", no need for 81 } 82 const char * szPath=strPath.c_str(); 83 84 //Debug("szPath.len=%d\n", strlen(szPath)); 85 nodeExist=tree->IsValidNode(szPath); 86 Debug("check for isValidNode of %s nodeExist=%d\n", szPath, nodeExist); 87 88 if (nodeExist) 89 { 90 Debug(" %s isValidNode\n", szPath); 91 numNodes++; 92 } 93 } 94 Debug("numNodes=%d\n", numNodes); 95 if (numNodes ==0 || numNodes== numPaths) 96 { 97 Debug("constraint Succeed\n"); 98 return (SYNCML_DM_SUCCESS); 99 } 100 Debug("constraint Failed !!!!!!\n"); 101 return (SYNCML_DM_CONSTRAINT_FAIL); 102} 103 104 105extern "C" 106int DMT_PluginLib_GetAPIVersion(void) 107{ 108 return DMT_PLUGIN_VERSION_1_1; 109} 110 111