version 1.5, 2009/02/04 22:46:59
|
version 1.5.6.2, 2014/03/12 22:35:02
|
|
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// | // |
////////////////////////////////////////////////////////////////////////// |
//%///////////////////////////////////////////////////////////////////////////// |
|
|
|
/** |
|
* Memory Resident Repository implementation. See PEP 307 |
|
*/ |
|
|
|
#include <cstdio> |
|
#include <cstdarg> |
|
#include <cctype> |
|
#include <Pegasus/Common/System.h> |
|
#include <Pegasus/Repository/MRRTypes.h> |
|
#include <Pegasus/Repository/MRRSerialization.h> |
|
#include <Pegasus/Common/Constants.h> |
|
#include "cimmofMRR.h" |
|
#include "Closure.h" |
|
|
|
#define PEGASUS_LLD "%" PEGASUS_64BIT_CONVERSION_WIDTH "d" |
|
#define PEGASUS_LLU "%" PEGASUS_64BIT_CONVERSION_WIDTH "u" |
|
|
|
PEGASUS_USING_STD; |
|
|
|
PEGASUS_NAMESPACE_BEGIN |
|
|
|
#define PEGASUS_ARRAY_T CIMConstQualifier |
|
# include <Pegasus/Common/ArrayImpl.h> |
|
#undef PEGASUS_ARRAY_T |
|
|
|
//============================================================================== |
// | // |
// Local routines: | // Local routines: |
// | // |
|
|
Uint32 flags = 0; | Uint32 flags = 0; |
| |
if (isProperty) | if (isProperty) |
|
{ |
flags |= MRR_FLAG_READ; | flags |= MRR_FLAG_READ; |
|
} |
| |
if (isParameter) | if (isParameter) |
|
{ |
flags |= MRR_FLAG_IN; | flags |= MRR_FLAG_IN; |
|
} |
| |
|
// set the flags bits in the qualifier maskfor each qualifier type |
for (Uint32 i = 0; i < c.getQualifierCount(); i++) | for (Uint32 i = 0; i < c.getQualifierCount(); i++) |
{ | { |
CIMConstQualifier cq = c.getQualifier(i); | CIMConstQualifier cq = c.getQualifier(i); |
const CIMName& qn = cq.getName(); | const CIMName& qn = cq.getName(); |
| |
if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray()) | if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray()) |
|
{ |
continue; | continue; |
|
} |
| |
Boolean x; | Boolean x; |
cq.getValue().get(x); | cq.getValue().get(x); |
| |
|
|
if (System::strcasecmp(*Str(qn), "KEY") == 0) | if (System::strcasecmp(*Str(qn), "KEY") == 0) |
{ | { |
if (x) | if (x) |
|
|
Uint32 pos = cc.findQualifier(name); | Uint32 pos = cc.findQualifier(name); |
| |
if (pos == PEG_NOT_FOUND) | if (pos == PEG_NOT_FOUND) |
|
{ |
return false; | return false; |
|
} |
| |
CIMConstQualifier cq = cc.getQualifier(pos); | CIMConstQualifier cq = cc.getQualifier(pos); |
| |
if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray()) | if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray()) |
|
{ |
return false; | return false; |
|
} |
| |
Boolean x; | Boolean x; |
cq.getValue().get(x); | cq.getValue().get(x); |
|
|
} | } |
| |
if (quote) | if (quote) |
|
{ |
fputc('"', os); | fputc('"', os); |
|
} |
| |
if (cv.isArray()) | if (cv.isArray()) |
{ | { |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeBoolean(os, x[i]); | _writeBoolean(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeUint8(os, x[i]); | _writeUint8(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeSint8(os, x[i]); | _writeSint8(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeUint16(os, x[i]); | _writeUint16(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeSint16(os, x[i]); | _writeSint16(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeUint32(os, x[i]); | _writeUint32(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeSint32(os, x[i]); | _writeSint32(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeUint64(os, x[i]); | _writeUint64(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeSint64(os, x[i]); | _writeSint64(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeReal32(os, x[i]); | _writeReal32(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeReal64(os, x[i]); | _writeReal64(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeChar16(os, x[i]); | _writeChar16(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
_writeUint16(os, x.size()); | _writeUint16(os, x.size()); |
| |
for (Uint32 i = 0; i < x.size(); i++) | for (Uint32 i = 0; i < x.size(); i++) |
|
{ |
_writeDateTime(os, x[i]); | _writeDateTime(os, x[i]); |
|
} |
break; | break; |
} | } |
| |
|
|
} | } |
| |
if (quote) | if (quote) |
|
{ |
fputc('"', os); | fputc('"', os); |
|
} |
| |
return 0; | return 0; |
} | } |
|
|
FILE* is = fopen(*Str(path), "r"); | FILE* is = fopen(*Str(path), "r"); |
| |
if (!is) | if (!is) |
|
{ |
return; | return; |
|
} |
| |
char buffer[1024]; | char buffer[1024]; |
| |
for (int line = 1; fgets(buffer, sizeof(buffer), is) != NULL; line++) | for (int line = 1; fgets(buffer, sizeof(buffer), is) != NULL; line++) |
{ | { |
if (buffer[0] == '#') | if (buffer[0] == '#') |
|
{ |
continue; | continue; |
|
} |
| |
char* start = buffer; | char* start = buffer; |
| |
// Remove leading whitespace. | // Remove leading whitespace. |
| |
while (isspace(*start)) | while (isspace(*start)) |
|
{ |
start++; | start++; |
|
} |
| |
// Remove trailing whitespace. | // Remove trailing whitespace. |
| |
char* p = start; | char* p = start; |
| |
while (*p) | while (*p) |
|
{ |
p++; | p++; |
|
} |
| |
while (p != start && isspace(p[-1])) | while (p != start && isspace(p[-1])) |
|
{ |
*--p = '\0'; | *--p = '\0'; |
|
} |
| |
// Skip empty lines. | // Skip empty lines. |
| |
if (*start == '\0') | if (*start == '\0') |
|
{ |
continue; | continue; |
|
} |
| |
// Skip comment lines: | // Skip comment lines: |
| |
if (*start == '#') | if (*start == '#') |
|
{ |
continue; | continue; |
|
} |
| |
/* Check whether legal class name. */ | /* Check whether legal class name. */ |
| |
|
|
} | } |
| |
if (!found) | if (!found) |
|
{ |
classes.append(start); | classes.append(start); |
} | } |
|
} |
| |
fclose(is); | fclose(is); |
} | } |
|
|
printf("Created %s_namespace.cpp\n", *Str(ns)); | printf("Created %s_namespace.cpp\n", *Str(ns)); |
| |
if (_instances.size()) | if (_instances.size()) |
|
{ |
printf("Created %s_namespace.mrr\n", *Str(ns)); | printf("Created %s_namespace.mrr\n", *Str(ns)); |
|
} |
| |
printf("\n"); | printf("\n"); |
} | } |
|
|
for (Uint32 i = 0; i < _classes.size(); i++) | for (Uint32 i = 0; i < _classes.size(); i++) |
{ | { |
if (_classes[i].getClassName() == className) | if (_classes[i].getClassName() == className) |
|
{ |
return i; | return i; |
} | } |
|
} |
| |
// Not found! | // Not found! |
return PEG_NOT_FOUND; | return PEG_NOT_FOUND; |
|
|
for (Uint32 i = 0; i < _qualifiers.size(); i++) | for (Uint32 i = 0; i < _qualifiers.size(); i++) |
{ | { |
if (_qualifiers[i].getName() == qualifierName) | if (_qualifiers[i].getName() == qualifierName) |
|
{ |
return i; | return i; |
} | } |
|
} |
| |
// Not found! | // Not found! |
return PEG_NOT_FOUND; | return PEG_NOT_FOUND; |
|
|
const CIMConstQualifier& cq) | const CIMConstQualifier& cq) |
{ | { |
CIMName qn = cq.getName(); | CIMName qn = cq.getName(); |
CIMType qt = cq.getType(); |
|
CIMValue qv = cq.getValue(); | CIMValue qv = cq.getValue(); |
| |
Uint32 pos = _findQualifier(qn); | Uint32 pos = _findQualifier(qn); |
| |
if (pos == PEG_NOT_FOUND) | if (pos == PEG_NOT_FOUND) |
|
{ |
_throw(CIM_ERR_FAILED, "undefined qualifier: %s", *Str(qn)); | _throw(CIM_ERR_FAILED, "undefined qualifier: %s", *Str(qn)); |
|
} |
| |
// Write the qualifier string literal: | // Write the qualifier string literal: |
| |
|
|
_out("%s", *Str(scopes[i])); | _out("%s", *Str(scopes[i])); |
| |
if (i + 1 != scopes.size()) | if (i + 1 != scopes.size()) |
|
{ |
_out("|"); | _out("|"); |
} | } |
|
} |
| |
_outn(","); | _outn(","); |
} | } |
|
|
_out("%s", *Str(flavors[i])); | _out("%s", *Str(flavors[i])); |
| |
if (i + 1 != flavors.size()) | if (i + 1 != flavors.size()) |
|
{ |
_out("|"); | _out("|"); |
} | } |
|
} |
| |
_outn(","); | _outn(","); |
} | } |
|
|
Array<CIMConstQualifier> tmp; | Array<CIMConstQualifier> tmp; |
| |
for (Uint32 i = 0; i < c.getQualifierCount(); i++) | for (Uint32 i = 0; i < c.getQualifierCount(); i++) |
|
{ |
tmp.append(c.getQualifier(i)); | tmp.append(c.getQualifier(i)); |
|
} |
| |
return tmp; | return tmp; |
} | } |
|
|
{ | { |
CIMConstQualifier cq = qualifiers[i]; | CIMConstQualifier cq = qualifiers[i]; |
CIMName qn = cq.getName(); | CIMName qn = cq.getName(); |
CIMType qt = cq.getType(); |
|
| |
if (_discard && qn == "Description") | if (_discard && qn == "Description") |
|
{ |
continue; | continue; |
|
} |
| |
#if 0 | #if 0 |
if (qt == CIMTYPE_BOOLEAN && !cq.isArray()) | if (qt == CIMTYPE_BOOLEAN && !cq.isArray()) |
|
{ |
continue; | continue; |
|
} |
#endif | #endif |
| |
_writeQualifier(_qualifiers, cq); | _writeQualifier(_qualifiers, cq); |
|
|
CIMName cn = _classes[i].getClassName(); | CIMName cn = _classes[i].getClassName(); |
| |
if (_includeClass(cn)) | if (_includeClass(cn)) |
|
{ |
_outn("extern MRRClass __%s_%s;", *Str(ns), *Str(cn)); | _outn("extern MRRClass __%s_%s;", *Str(ns), *Str(cn)); |
} | } |
|
} |
| |
_nl(); | _nl(); |
| |
|
|
CIMName cn = _classes[i].getClassName(); | CIMName cn = _classes[i].getClassName(); |
| |
if (_includeClass(cn)) | if (_includeClass(cn)) |
|
{ |
_writeClass(nameSpace, _classes[i]); | _writeClass(nameSpace, _classes[i]); |
} | } |
|
} |
| |
// Write qualifiers list: | // Write qualifiers list: |
| |
|
|
CIMName cn = _classes[i].getClassName(); | CIMName cn = _classes[i].getClassName(); |
| |
if (_includeClass(cn)) | if (_includeClass(cn)) |
|
{ |
_outn("&__%s_%s,", *Str(ns), *Str(cn)); | _outn("&__%s_%s,", *Str(ns), *Str(cn)); |
} | } |
|
} |
| |
_outn("0,"); | _outn("0,"); |
| |
|
|
bool cimmofMRR::_includeClass(const CIMName& cn) | bool cimmofMRR::_includeClass(const CIMName& cn) |
{ | { |
if (_closure.size() == 0) | if (_closure.size() == 0) |
|
{ |
return true; | return true; |
|
} |
| |
for (Uint32 i = 0; i < _closure.size(); i++) | for (Uint32 i = 0; i < _closure.size(); i++) |
{ | { |
if (_closure[i] == cn) | if (_closure[i] == cn) |
|
{ |
return true; | return true; |
} | } |
|
} |
| |
return false; | return false; |
} | } |