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_extensions.hxx" 26 27 #include <bibconfig.hxx> 28 #include <svl/svarray.hxx> 29 #include <tools/debug.hxx> 30 #include <com/sun/star/uno/Sequence.hxx> 31 #include <com/sun/star/uno/Any.hxx> 32 #include <com/sun/star/beans/PropertyValue.hpp> 33 #include <com/sun/star/container/XNameAccess.hpp> 34 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 35 #include <comphelper/processfactory.hxx> 36 37 using namespace rtl; 38 using namespace ::com::sun::star::uno; 39 using namespace ::com::sun::star::beans; 40 using namespace ::com::sun::star::container; 41 using namespace ::com::sun::star::lang; 42 /* -----------------11.11.99 14:34------------------- 43 44 --------------------------------------------------*/ 45 typedef Mapping* MappingPtr; 46 SV_DECL_PTRARR_DEL(MappingArray, MappingPtr, 2, 2) 47 SV_IMPL_PTRARR(MappingArray, MappingPtr); 48 49 #define C2U(cChar) OUString::createFromAscii(cChar) 50 51 const char* cDataSourceHistory = "DataSourceHistory"; 52 /* -----------------------------13.11.00 12:21-------------------------------- 53 54 ---------------------------------------------------------------------------*/ 55 Sequence<OUString> BibConfig::GetPropertyNames() 56 { 57 static Sequence<OUString> aNames; 58 if(!aNames.getLength()) 59 { 60 aNames.realloc(8); 61 OUString* pNames = aNames.getArray(); 62 pNames[0] = C2U("CurrentDataSource/DataSourceName"); 63 pNames[1] = C2U("CurrentDataSource/Command"); 64 pNames[2] = C2U("CurrentDataSource/CommandType"); 65 pNames[3] = C2U("BeamerHeight"); 66 pNames[4] = C2U("ViewHeight"); 67 pNames[5] = C2U("QueryText"); 68 pNames[6] = C2U("QueryField"); 69 pNames[7] = C2U("ShowColumnAssignmentWarning"); 70 } 71 return aNames; 72 } 73 /* -----------------------------13.11.00 11:00-------------------------------- 74 75 ---------------------------------------------------------------------------*/ 76 BibConfig::BibConfig() : 77 ConfigItem(C2U("Office.DataAccess/Bibliography"), CONFIG_MODE_DELAYED_UPDATE), 78 pMappingsArr(new MappingArray), 79 nBeamerSize(0), 80 nViewSize(0), 81 bShowColumnAssignmentWarning(sal_False) 82 { 83 //Names of the default columns 84 aColumnDefaults[0] = C2U("Identifier"); 85 aColumnDefaults[1] = C2U("BibliographyType"); 86 aColumnDefaults[2] = C2U("Author"); 87 aColumnDefaults[3] = C2U("Title"); 88 aColumnDefaults[4] = C2U("Year"); 89 aColumnDefaults[5] = C2U("ISBN"); 90 aColumnDefaults[6] = C2U("Booktitle"); 91 aColumnDefaults[7] = C2U("Chapter"); 92 aColumnDefaults[8] = C2U("Edition"); 93 aColumnDefaults[9] = C2U("Editor"); 94 aColumnDefaults[10] = C2U("Howpublished"); 95 aColumnDefaults[11] = C2U("Institution"); 96 aColumnDefaults[12] = C2U("Journal"); 97 aColumnDefaults[13] = C2U("Month"); 98 aColumnDefaults[14] = C2U("Note"); 99 aColumnDefaults[15] = C2U("Annote"); 100 aColumnDefaults[16] = C2U("Number"); 101 aColumnDefaults[17] = C2U("Organizations"); 102 aColumnDefaults[18] = C2U("Pages"); 103 aColumnDefaults[19] = C2U("Publisher"); 104 aColumnDefaults[20] = C2U("Address"); 105 aColumnDefaults[21] = C2U("School"); 106 aColumnDefaults[22] = C2U("Series"); 107 aColumnDefaults[23] = C2U("ReportType"); 108 aColumnDefaults[24] = C2U("Volume"); 109 aColumnDefaults[25] = C2U("URL"); 110 aColumnDefaults[26] = C2U("Custom1"); 111 aColumnDefaults[27] = C2U("Custom2"); 112 aColumnDefaults[28] = C2U("Custom3"); 113 aColumnDefaults[29] = C2U("Custom4"); 114 aColumnDefaults[30] = C2U("Custom5"); 115 116 117 const Sequence< OUString > aPropertyNames = GetPropertyNames(); 118 const Sequence<Any> aPropertyValues = GetProperties( aPropertyNames ); 119 const Any* pValues = aPropertyValues.getConstArray(); 120 if(aPropertyValues.getLength() == aPropertyNames.getLength()) 121 { 122 for(int nProp = 0; nProp < aPropertyNames.getLength(); nProp++) 123 { 124 if(pValues[nProp].hasValue()) 125 { 126 switch(nProp) 127 { 128 case 0: pValues[nProp] >>= sDataSource; break; 129 case 1: pValues[nProp] >>= sTableOrQuery; break; 130 case 2: pValues[nProp] >>= nTblOrQuery; break; 131 case 3: pValues[nProp] >>= nBeamerSize; break; 132 case 4: pValues[nProp] >>= nViewSize ; break; 133 case 5: pValues[nProp] >>= sQueryText ; break; 134 case 6: pValues[nProp] >>= sQueryField; break; 135 case 7: 136 bShowColumnAssignmentWarning = *(sal_Bool*)pValues[nProp].getValue(); 137 break; 138 } 139 } 140 } 141 } 142 OUString sName(C2U("DataSourceName")); 143 OUString sTable(C2U("Command")); 144 OUString sCommandType(C2U("CommandType")); 145 Sequence< OUString > aNodeNames = GetNodeNames(C2U(cDataSourceHistory)); 146 const OUString* pNodeNames = aNodeNames.getConstArray(); 147 for(sal_Int32 nNode = 0; nNode < aNodeNames.getLength(); nNode++) 148 { 149 Sequence<OUString> aHistoryNames(3); 150 OUString* pHistoryNames = aHistoryNames.getArray(); 151 152 OUString sPrefix(C2U(cDataSourceHistory)); 153 sPrefix += C2U("/"); 154 sPrefix += pNodeNames[nNode]; 155 sPrefix += C2U("/"); 156 pHistoryNames[0] = sPrefix; 157 pHistoryNames[0] += sName; 158 pHistoryNames[1] = sPrefix; 159 pHistoryNames[1] += sTable; 160 pHistoryNames[2] = sPrefix; 161 pHistoryNames[2] += sCommandType; 162 163 Sequence<Any> aHistoryValues = GetProperties( aHistoryNames ); 164 const Any* pHistoryValues = aHistoryValues.getConstArray(); 165 166 if(aHistoryValues.getLength() == aHistoryNames.getLength()) 167 { 168 Mapping* pMapping = new Mapping; 169 pHistoryValues[0] >>= pMapping->sURL; 170 pHistoryValues[1] >>= pMapping->sTableName; 171 pHistoryValues[2] >>= pMapping->nCommandType; 172 //field assignment is contained in another set 173 sPrefix += C2U("Fields"); 174 Sequence< OUString > aAssignmentNodeNames = GetNodeNames(sPrefix); 175 const OUString* pAssignmentNodeNames = aAssignmentNodeNames.getConstArray(); 176 Sequence<OUString> aAssignmentPropertyNames(aAssignmentNodeNames.getLength() * 2); 177 OUString* pAssignmentPropertyNames = aAssignmentPropertyNames.getArray(); 178 sal_Int16 nFieldIdx = 0; 179 for(sal_Int16 nField = 0; nField < aAssignmentNodeNames.getLength(); nField++) 180 { 181 OUString sSubPrefix(sPrefix); 182 sSubPrefix += C2U("/"); 183 sSubPrefix += pAssignmentNodeNames[nField]; 184 pAssignmentPropertyNames[nFieldIdx] = sSubPrefix; 185 pAssignmentPropertyNames[nFieldIdx++] += C2U("/ProgrammaticFieldName"); 186 pAssignmentPropertyNames[nFieldIdx] = sSubPrefix; 187 pAssignmentPropertyNames[nFieldIdx++] += C2U("/AssignedFieldName"); 188 } 189 Sequence<Any> aAssignmentValues = GetProperties(aAssignmentPropertyNames); 190 const Any* pAssignmentValues = aAssignmentValues.getConstArray(); 191 OUString sTempLogical; 192 OUString sTempReal; 193 sal_Int16 nSetMapping = 0; 194 nFieldIdx = 0; 195 for(sal_Int16 nFieldVal = 0; nFieldVal < aAssignmentValues.getLength() / 2; nFieldVal++) 196 { 197 pAssignmentValues[nFieldIdx++] >>= sTempLogical; 198 pAssignmentValues[nFieldIdx++] >>= sTempReal; 199 if(sTempLogical.getLength() && sTempReal.getLength()) 200 { 201 pMapping->aColumnPairs[nSetMapping].sLogicalColumnName = sTempLogical; 202 pMapping->aColumnPairs[nSetMapping++].sRealColumnName = sTempReal; 203 } 204 } 205 pMappingsArr->Insert(pMapping, pMappingsArr->Count()); 206 } 207 } 208 } 209 /* -----------------------------13.11.00 11:00-------------------------------- 210 211 ---------------------------------------------------------------------------*/ 212 BibConfig::~BibConfig() 213 { 214 if(IsModified()) 215 Commit(); 216 delete pMappingsArr; 217 } 218 /* -----------------------------13.11.00 12:08-------------------------------- 219 220 ---------------------------------------------------------------------------*/ 221 BibDBDescriptor BibConfig::GetBibliographyURL() 222 { 223 BibDBDescriptor aRet; 224 aRet.sDataSource = sDataSource; 225 aRet.sTableOrQuery = sTableOrQuery; 226 aRet.nCommandType = nTblOrQuery; 227 return aRet; 228 }; 229 /* -----------------------------13.11.00 12:20-------------------------------- 230 231 ---------------------------------------------------------------------------*/ 232 void BibConfig::SetBibliographyURL(const BibDBDescriptor& rDesc) 233 { 234 sDataSource = rDesc.sDataSource; 235 sTableOrQuery = rDesc.sTableOrQuery; 236 nTblOrQuery = rDesc.nCommandType; 237 SetModified(); 238 }; 239 //--------------------------------------------------------------------------- 240 void BibConfig::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& ) 241 { 242 } 243 244 void BibConfig::Commit() 245 { 246 const Sequence<OUString> aPropertyNames = GetPropertyNames(); 247 Sequence<Any> aValues(aPropertyNames.getLength()); 248 Any* pValues = aValues.getArray(); 249 250 for(int nProp = 0; nProp < aPropertyNames.getLength(); nProp++) 251 { 252 switch(nProp) 253 { 254 case 0: pValues[nProp] <<= sDataSource; break; 255 case 1: pValues[nProp] <<= sTableOrQuery; break; 256 case 2: pValues[nProp] <<= nTblOrQuery; break; 257 case 3: pValues[nProp] <<= nBeamerSize; break; 258 case 4: pValues[nProp] <<= nViewSize; break; 259 case 5: pValues[nProp] <<= sQueryText; break; 260 case 6: pValues[nProp] <<= sQueryField; break; 261 case 7: 262 pValues[nProp].setValue(&bShowColumnAssignmentWarning, ::getBooleanCppuType()); 263 break; 264 } 265 } 266 PutProperties(aPropertyNames, aValues); 267 ClearNodeSet( C2U(cDataSourceHistory)); 268 OUString sEmpty; 269 Sequence< PropertyValue > aNodeValues(pMappingsArr->Count() * 3); 270 PropertyValue* pNodeValues = aNodeValues.getArray(); 271 272 sal_Int32 nIndex = 0; 273 OUString sName(C2U("DataSourceName")); 274 OUString sTable(C2U("Command")); 275 OUString sCommandType(C2U("CommandType")); 276 for(sal_Int32 i = 0; i < pMappingsArr->Count(); i++) 277 { 278 const Mapping* pMapping = pMappingsArr->GetObject((sal_uInt16)i); 279 OUString sPrefix(C2U(cDataSourceHistory)); 280 sPrefix += C2U("/_"); 281 sPrefix += OUString::valueOf(i); 282 sPrefix += C2U("/"); 283 pNodeValues[nIndex].Name = sPrefix; 284 pNodeValues[nIndex].Name += sName; 285 pNodeValues[nIndex++].Value <<= pMapping->sURL; 286 pNodeValues[nIndex].Name = sPrefix; 287 pNodeValues[nIndex].Name += sTable; 288 pNodeValues[nIndex++].Value <<= pMapping->sTableName; 289 pNodeValues[nIndex].Name = sPrefix; 290 pNodeValues[nIndex].Name += sCommandType; 291 pNodeValues[nIndex++].Value <<= pMapping->nCommandType; 292 SetSetProperties( C2U(cDataSourceHistory), aNodeValues); 293 294 sPrefix += C2U("Fields"); 295 sal_Int32 nFieldAssignment = 0; 296 OUString sFieldName = C2U("/ProgrammaticFieldName"); 297 OUString sDatabaseFieldName = C2U("/AssignedFieldName"); 298 ClearNodeSet( sPrefix ); 299 300 while(nFieldAssignment < COLUMN_COUNT && 301 pMapping->aColumnPairs[nFieldAssignment].sLogicalColumnName.getLength()) 302 { 303 OUString sSubPrefix(sPrefix); 304 sSubPrefix += C2U("/_"); 305 sSubPrefix += OUString::valueOf(nFieldAssignment); 306 Sequence< PropertyValue > aAssignmentValues(2); 307 PropertyValue* pAssignmentValues = aAssignmentValues.getArray(); 308 pAssignmentValues[0].Name = sSubPrefix; 309 pAssignmentValues[0].Name += sFieldName; 310 pAssignmentValues[0].Value <<= pMapping->aColumnPairs[nFieldAssignment].sLogicalColumnName; 311 pAssignmentValues[1].Name = sSubPrefix; 312 pAssignmentValues[1].Name += sDatabaseFieldName; 313 pAssignmentValues[1].Value <<= pMapping->aColumnPairs[nFieldAssignment].sRealColumnName; 314 SetSetProperties( sPrefix, aAssignmentValues ); 315 nFieldAssignment++; 316 } 317 } 318 } 319 /* -----------------------------13.11.00 12:23-------------------------------- 320 321 ---------------------------------------------------------------------------*/ 322 const Mapping* BibConfig::GetMapping(const BibDBDescriptor& rDesc) const 323 { 324 for(sal_uInt16 i = 0; i < pMappingsArr->Count(); i++) 325 { 326 const Mapping* pMapping = pMappingsArr->GetObject(i); 327 sal_Bool bURLEqual = rDesc.sDataSource.equals(pMapping->sURL); 328 if(rDesc.sTableOrQuery == pMapping->sTableName && bURLEqual) 329 return pMapping; 330 } 331 return 0; 332 } 333 /* -----------------------------13.11.00 12:23-------------------------------- 334 335 ---------------------------------------------------------------------------*/ 336 void BibConfig::SetMapping(const BibDBDescriptor& rDesc, const Mapping* pSetMapping) 337 { 338 for(sal_uInt16 i = 0; i < pMappingsArr->Count(); i++) 339 { 340 const Mapping* pMapping = pMappingsArr->GetObject(i); 341 sal_Bool bURLEqual = rDesc.sDataSource.equals(pMapping->sURL); 342 if(rDesc.sTableOrQuery == pMapping->sTableName && bURLEqual) 343 { 344 pMappingsArr->DeleteAndDestroy(i, 1); 345 break; 346 } 347 } 348 Mapping* pNew = new Mapping(*pSetMapping); 349 pMappingsArr->Insert(pNew, pMappingsArr->Count()); 350 SetModified(); 351 } 352 /* -----------------------------20.11.00 11:56-------------------------------- 353 354 ---------------------------------------------------------------------------*/ 355 DBChangeDialogConfig_Impl::DBChangeDialogConfig_Impl() 356 { 357 } 358 /* -----------------------------20.11.00 11:57-------------------------------- 359 360 ---------------------------------------------------------------------------*/ 361 DBChangeDialogConfig_Impl::~DBChangeDialogConfig_Impl() 362 { 363 } 364 /* -----------------------------14.03.01 12:53-------------------------------- 365 366 ---------------------------------------------------------------------------*/ 367 const Sequence<OUString>& DBChangeDialogConfig_Impl::GetDataSourceNames() 368 { 369 if(!aSourceNames.getLength()) 370 { 371 Reference<XNameAccess> xDBContext; 372 Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 373 if( xMgr.is() ) 374 { 375 Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); 376 xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ; 377 } 378 if(xDBContext.is()) 379 { 380 aSourceNames = xDBContext->getElementNames(); 381 } 382 } 383 return aSourceNames; 384 } 385 386