1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_idlc.hxx" 26 #include <idlc/astenum.hxx> 27 28 #include "registry/version.h" 29 #include "registry/writer.hxx" 30 31 using namespace ::rtl; 32 33 AstEnum::AstEnum(const ::rtl::OString& name, AstScope* pScope) 34 : AstType(NT_enum, name, pScope) 35 , AstScope(NT_enum) 36 , m_enumValueCount(0) 37 { 38 } 39 40 AstEnum::~AstEnum() 41 { 42 } 43 44 AstConstant* AstEnum::checkValue(AstExpression* pExpr) 45 { 46 DeclList::const_iterator iter = getIteratorBegin(); 47 DeclList::const_iterator end = getIteratorEnd(); 48 AstConstant* pConst = NULL; 49 AstDeclaration* pDecl = NULL; 50 51 while ( iter != end) 52 { 53 pDecl = *iter; 54 pConst = (AstConstant*)pDecl; 55 56 if (pConst->getConstValue()->compare(pExpr)) 57 return pConst; 58 59 ++iter; 60 } 61 62 if ( pExpr->getExprValue()->u.lval > m_enumValueCount ) 63 m_enumValueCount = pExpr->getExprValue()->u.lval + 1; 64 65 return NULL; 66 } 67 68 sal_Bool AstEnum::dump(RegistryKey& rKey) 69 { 70 RegistryKey localKey; 71 if (rKey.createKey( OStringToOUString(getFullName(), RTL_TEXTENCODING_UTF8 ), localKey)) 72 { 73 fprintf(stderr, "%s: warning, could not create key '%s' in '%s'\n", 74 idlc()->getOptions()->getProgramName().getStr(), 75 getFullName().getStr(), OUStringToOString(rKey.getRegistryName(), RTL_TEXTENCODING_UTF8).getStr()); 76 return sal_False; 77 } 78 79 OUString emptyStr; 80 sal_uInt16 nConst = getNodeCount(NT_enum_val); 81 if ( nConst > 0 ) 82 { 83 typereg::Writer aBlob( 84 m_bPublished ? TYPEREG_VERSION_1 : TYPEREG_VERSION_0, 85 getDocumentation(), emptyStr, RT_TYPE_ENUM, m_bPublished, 86 OStringToOUString(getRelativName(), RTL_TEXTENCODING_UTF8), 0, 87 nConst, 0, 0); 88 89 DeclList::const_iterator iter = getIteratorBegin(); 90 DeclList::const_iterator end = getIteratorEnd(); 91 AstDeclaration* pDecl = NULL; 92 sal_uInt16 index = 0; 93 while ( iter != end ) 94 { 95 pDecl = *iter; 96 if ( pDecl->getNodeType() == NT_enum_val ) 97 ((AstConstant*)pDecl)->dumpBlob(aBlob, index++, false); 98 99 ++iter; 100 } 101 102 sal_uInt32 aBlobSize; 103 void const * pBlob = aBlob.getBlob(&aBlobSize); 104 105 if (localKey.setValue(emptyStr, RG_VALUETYPE_BINARY, 106 (RegValue)pBlob, aBlobSize)) 107 { 108 fprintf(stderr, "%s: warning, could not set value of key \"%s\" in %s\n", 109 idlc()->getOptions()->getProgramName().getStr(), 110 getFullName().getStr(), OUStringToOString(localKey.getRegistryName(), RTL_TEXTENCODING_UTF8).getStr()); 111 return sal_False; 112 } 113 } 114 115 return sal_True; 116 } 117 118 AstDeclaration* AstEnum::addDeclaration(AstDeclaration* pDecl) 119 { 120 return AstScope::addDeclaration(pDecl); 121 } 122