HRESULT AsdkSheetSet::setNewSheetLocation(char* defSheetLoc, IAcSmSubset *pSubSet) { if (FAILED(isInitialized("setNewSheetLocation"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComQIPtr<IAcSmSubset> pSub = pSubSet; if(!pSub.p) // Create a category at the root pSub = m_pSheetSet; // If new sheet location is specified, release it if(pDefNewSheetLoc.p) pDefNewSheetLoc.Release(); if (FAILED(pDefNewSheetLoc.CoCreateInstance(L"AcSmComponents.AcSmFileReference"))) { acutPrintf("\n Cannot create file reference"); return E_POINTER; } if (FAILED(pDefNewSheetLoc->InitNew(m_pDb))) { acutPrintf("\n Cannot initialize file reference"); return E_FAIL; } CComBSTR bstrFileName(defSheetLoc); // sheet location if (FAILED(pDefNewSheetLoc->SetFileName(bstrFileName))) { return E_FAIL; } if(FAILED(pSub->SetNewSheetLocation(pDefNewSheetLoc))) { acutPrintf("\n Cannot add default sheet location"); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
HRESULT AsdkSheetSet::addLabelBlock(char* blockName, char* drawingPath) { if(FAILED(isInitialized("addLabelBlock"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComPtr<IAcSmAcDbBlockRecordReference> pLabelRef = NULL; if (FAILED(pLabelRef.CoCreateInstance(L"AcSmComponents.AcSmAcDbBlockRecordReference"))) { acutPrintf("\n addLabelBlock Failed! Cannot create named object reference"); return E_POINTER; } if (FAILED(pLabelRef->InitNew(m_pDb))) return E_FAIL; CComBSTR bstrDrawingLoc(drawingPath); if (FAILED(pLabelRef->SetFileName(bstrDrawingLoc))) { acutPrintf("\n addLabelBlock Failed! Cannot set file %s", drawingPath); return E_FAIL; } CComBSTR bstrBlockName(blockName); if (FAILED(pLabelRef->SetName(bstrBlockName))) { acutPrintf("\n addLabelBlock Failed! Cannot set block name %s", blockName); return E_FAIL; } if(FAILED(m_pSheetSet->SetDefLabelBlk(pLabelRef))) { return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
/** Maze z databaze informace o souboru. * * Presahne-li pocet smazanych polozek MAX_DELETED_ITEMS, reorganizuje * databazi. * * Navratove hodnoty: * * - 1 vse OK. * - -1 chyba pri vytvareni klice k souboru * - -2 chyba pri zamykani/odemykani databaze * - -3 chyba pri praci s databazi * */ int DirectoryDatabase::DeleteFileInfo(string &name) { string key; datum keyd, datad; int ret; ret = File2Key(name.c_str(), key); if (ret != 1) return -1; keyd.dptr = (char *) key.c_str(); keyd.dsize = key.size(); // --- zacatek KRITICKE SEKCE --- if (LockDatabase() != 1) return -2; // otevreme databazi pro zapis db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_WRITER, S_IRUSR | S_IWUSR, 0); if (db_file == 0) { #ifdef DD_DEBUG cout << getpid() << "DD::DFI open gdbm_errno = " << gdbm_errno << " ... " << gdbm_strerror(gdbm_errno) << endl; #endif UnlockDatabase(); return -3; } if (gdbm_delete(db_file, keyd) != 0) { #ifdef DD_DEBUG cout << getpid() << " - Informace o souboru " << name << " nelze z databaze odstranit." << endl; #endif gdbm_close(db_file); UnlockDatabase(); return -3; } else { num_of_deleted_items++; if (num_of_deleted_items >= MAX_DELETED_ITEMS) { // gdbm samo nezmensi velikost souboru databaze, je potreba ho // donutit pomoci gdbm_reorganize(), ktere by se nemelo volat moc // casto if (gdbm_reorganize(db_file) != 0) { #ifdef DD_DEBUG cout << getpid() << " - Nejspis se nepovedla reorganizace databaze ..." << endl; #endif } } }//else gdbm_close(db_file); if (UnlockDatabase() != 1) return -2; // --- konec KRITICKE SEKCE --- return 1; }
HRESULT AsdkSheetSet::addResourceFileLocation(char* resourceFileLocation) { if(FAILED(isInitialized("addResourceFileLocation"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComPtr<IAcSmResources> pResources = NULL; if (FAILED(m_pSheetSet->GetResources(&pResources))) return E_FAIL; CComBSTR bstrResourceLoc(resourceFileLocation); CComPtr<IAcSmFileReference> pFileReference = NULL; if (FAILED(pFileReference.CoCreateInstance(L"AcSmComponents.AcSmFileReference"))) { return E_POINTER; } if (FAILED(pFileReference->InitNew(m_pDb))) { return E_FAIL; } if (FAILED(pFileReference->SetFileName(bstrResourceLoc))) { return E_FAIL; } // add the resource location. if (FAILED(pResources->Add(pFileReference))) return E_FAIL; // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
ULONG NextAudioID( ULONG id, struct AHIBase* AHIBase ) { struct AHI_AudioDatabase *audiodb; struct AHI_AudioMode *node; ULONG nextid=AHI_INVALID_ID; if(AHIBase->ahib_DebugLevel >= AHI_DEBUG_HIGH) { Debug_NextAudioID(id); } audiodb = LockDatabase(); if(audiodb != NULL) { node = (struct AHI_AudioMode *) audiodb->ahidb_AudioModes.mlh_Head; if(id != AHI_INVALID_ID) { while(node != NULL) { ULONG thisid; thisid = GetTagData(AHIDB_AudioID,AHI_INVALID_ID,node->ahidbn_Tags); node = (struct AHI_AudioMode *) node->ahidbn_MinNode.mln_Succ; if(thisid == id) { break; } } } if(node && node->ahidbn_MinNode.mln_Succ) { nextid = GetTagData(AHIDB_AudioID, AHI_INVALID_ID, node->ahidbn_Tags); } UnlockDatabase(audiodb); } if(AHIBase->ahib_DebugLevel >= AHI_DEBUG_HIGH) { KPrintF("=>0x%08lx\n",nextid); } return nextid; }
HRESULT AsdkSheetSet::addSheetSelectionSet(char* selSetName, // Name of selection set char* selSetDesc, // Description IAcSmSheetSelSet **pSelSet) // Output pointer to selection set { if(FAILED(isInitialized("addSheetSelectionSet"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComPtr<IAcSmSheetSelSets> pSelSetS = NULL; if (FAILED(m_pSheetSet->GetSheetSelSets(&pSelSetS)) || (pSelSetS == NULL)) { acutPrintf("\n addSheetSelectionSet failed! Cannot get selection sets!!"); return E_FAIL; } // add a selection set to the selection set collection of the sheet set CComBSTR selSet(selSetName); CComBSTR selDesc(selSetDesc); if (FAILED (pSelSetS->Add(selSet, selDesc, pSelSet))) { acutPrintf("\n addSheetSelectionSet failed! Cannot add selection set %s!!", selSetName); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
HRESULT AsdkSheetSet::createNestedCategory(char* categoryName, // Category Name char* categoryDesc, // Category Description IAcSmSubset *pParentSet, // Parent category IAcSmSubset **pNewSubset // OUT - Newly created category ) { if(FAILED(isInitialized("createNestedCategory"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComQIPtr<IAcSmSubset> pSubSet = pParentSet; if(!pSubSet.p) // Create a category at the root pSubSet = m_pSheetSet; CComBSTR bstrCatName(categoryName); // Category name CComBSTR bstrCatDesc(categoryDesc); // Category description // create a new subset if(FAILED(pSubSet->CreateSubset(bstrCatName, bstrCatDesc, pNewSubset))) { acutPrintf("\n Subset creation failed"); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
/** Konstruktor. * Otevre databazi pro zadany adresar (dir), predpoklada, ze se soubor databaze (name) * nachazi v aktualnim adresari. Pokud selze otevreni databaze (napriklad nekdo * zmenil prava souboru na 000), hodi vyjimku GdbmError. Databazi otevre jen * pro cteni. * Implicitne da ingore_hidden na true. */ DirectoryDatabase::DirectoryDatabase(const char *name) throw(FileError, GdbmError) { db_name = name; lock_name = name; lock_name = lock_name + "_gdbm_lock"; // je mozne, ze name bude obsahovat i cestu - zamek se tedy bude vytvaret v // miste, kde je ulozena databaze - nemohou tam byt dva soubory stejneho // jmena, takze je vse OK. #ifdef DD_DEBUG cout << getpid() << " - creating database " << db_name << endl; #endif ignore_hidden = true; num_of_deleted_items = 0; locked = false; /* vytvorime novou databazi, nastavime souboru pravo cteni a zapisu, * fatal_func() nechame defaultni (0) */ if (LockDatabase() == -1) { string msg; msg = "Nepodarilo se zamknout databazi. Program mozna nebyl naposledy ciste ukoncen. Zkontrolujte prosim, "; msg = msg + "jestli neexistuje soubor " + lock_name + " a smazte jej."; throw FileError(msg.c_str(), -1); } // --- zacatek KRITICKE SEKCE --- //pokud databaze neexistuje, vytvorime ji db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_WRCREAT, S_IRUSR | S_IWUSR, 0); if (db_file == 0) throw GdbmError(); gdbm_close(db_file); if (UnlockDatabase() == -1) throw FileError("DirectoryDatabase(): Nepodarilo se odemknout databazi.", -1); // --- konec KRITICKE SEKCE --- }
HRESULT AsdkSheetSet::addCalloutBlock(char* blockName, char* drawingName) { if(FAILED(isInitialized("addCalloutBlock"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComPtr<IAcSmCalloutBlocks> pCalloutBlk = NULL; if (FAILED(m_pSheetSet->GetCalloutBlocks(&pCalloutBlk))) { acutPrintf("\n addCalloutBlock failed! Cannot get callout blocks!!"); return E_FAIL; } CComBSTR bstrBlockName(blockName); CComBSTR bstrFileName(drawingName); CComPtr<IAcSmAcDbBlockRecordReference> pCalloutRef = NULL; if (FAILED(pCalloutRef.CoCreateInstance(L"AcSmComponents.AcSmAcDbBlockRecordReference"))) { acutPrintf("\n addCalloutBlock failed! Cannot get named object reference!!"); return E_POINTER; } if (FAILED(pCalloutRef->InitNew(m_pDb))) return E_FAIL; if (FAILED(pCalloutRef->SetFileName(bstrFileName))) { acutPrintf("\n addCalloutBlock failed! Cannot set file name %s!!", drawingName); return E_FAIL; } if (FAILED(pCalloutRef->SetName(bstrBlockName))) { acutPrintf("\n addCalloutBlock failed! Cannot set block name %s!!", blockName); return E_FAIL; } if(FAILED(pCalloutBlk->Add(pCalloutRef))) { acutPrintf("\n addCalloutBlock failed! Cannot add callout reference!!"); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
/** Uklada do databaze informace o souboru. * * K vytvoreni klice pouziva File2Key. * * Navratove hodnoty: * * - 1 vse OK. * - -1 chyba pri vytvareni klice k souboru * - -2 chyba pri zamykani/odemykani databaze * - -3 chyba pri praci s databazi */ int DirectoryDatabase::PutFileInfo(FileInfo &file) { string key; datum keyd, datad; FileInfoGdbmRecord file_record; //data, ktera budou ulozena do databaze int store_err; int open_err; int ret; ret = File2Key(file.name.c_str(), key); if (ret != 1) return -1; keyd.dptr = (char *)key.c_str(); keyd.dsize = key.size(); file_record = (FileInfoGdbmRecord) file; //pretypujeme FileInfo na nas zaznam datad.dptr = (char *)&file_record; datad.dsize = sizeof(struct FileInfoGdbmRecord); #ifdef DD_DEBUG cout << getpid() << " - DD::PutFileInfo ... storing " << file_record.name << " juzra: " << file_record.user_name << " with i-node# " << key << " user_rights = " << file_record.user_rights << " in da dejtabejz" << endl; #endif // --- zacatek KRITICKE SEKCE --- if (LockDatabase() != 1) return -2; // otevreme databazi pro zapis db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_WRITER, S_IRUSR | S_IWUSR, 0); if (db_file == 0) { //nastala chyba #ifdef DD_DEBUG cout << getpid() << "DD::PFI open gdbm_errno = " << gdbm_errno << " ... " << gdbm_strerror(gdbm_errno) << endl; #endif UnlockDatabase(); return -3; } //ulozime data int err = gdbm_store(db_file, keyd, datad, GDBM_REPLACE); if (err != 0) { #ifdef DD_DEBUG cout << getpid() << "DD::PFI store gdbm_errno = " << gdbm_errno << " ... " << gdbm_strerror(gdbm_errno) << endl; #endif gdbm_close(db_file); //musime, viz komentar niz UnlockDatabase(); return -3; } //databazi zase musime zavrit!!! aby ostatni procesy mohly cist a //zapisovat !!! gdbm_close(db_file); ret = UnlockDatabase(); if (ret != 1){ return -2; } // --- konec KRITICKE SEKCE --- #ifdef DD_DEBUG cout << getpid() << " - DD::PutFileInfo ... stored" << endl; #endif return 1; }
HRESULT AsdkSheetSet::addSheet(IAcSmSheet** pNewSheet, IAcSmSubset* pParentCategory, char* sheetName, char* sheetDesc, char* layoutName, char* layoutDwgPath) { if (FAILED(isInitialized("addSheet"))) return E_FAIL; // Sheet subset or category CComQIPtr<IAcSmSubset> pSubSet; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } if(!pParentCategory) { // insert sheet at root pSubSet = m_pSheetSet; } else pSubSet = pParentCategory; // Add a sheet to sheet root or sub-category // A new sheet based on a dwt can be added *only* if the following 2 conditions are satisfied // 1. A default drawing template (which *should* contain a sheet/layout ) // is set up for the sheet set // 2. A default location where the new sheet will be placed is set up // for the sheet set if(!isValid(layoutName)) { // Check for above conditions if((pDefDwtLayoutRef.p == NULL) || (pDefNewSheetLoc.p == NULL)) { acutPrintf("\n Cannot add new sheet %s!!", sheetName); } else { // If layoutName is invalid, // create a fresh sheet (not based on existing layout) CComBSTR bstrSheetName(sheetName); // sheet name CComBSTR bstrSheetDesc(sheetDesc); // sheet description HRESULT hr; if(FAILED(hr =pSubSet->AddNewSheet(bstrSheetName, bstrSheetDesc, pNewSheet))) { acutPrintf("\n Cannot add new sheet"); return E_FAIL; } } } else // add a sheet based on existing layout { CComPtr<IAcSmAcDbLayoutReference> pLayoutRef; // create the NamedAcDbObjectReference. if(FAILED(pLayoutRef.CoCreateInstance(L"AcSmComponents.AcSmAcDbLayoutReference"))) { acutPrintf("\n Cannot create named object reference"); return E_FAIL; } if(FAILED(pLayoutRef->InitNew(m_pSheetSet))) { acutPrintf("\n Cannot initialize layout"); return E_FAIL; } CComBSTR bstrLayoutName(layoutName); // layout name // Set layout name if(FAILED(pLayoutRef->SetName(bstrLayoutName))) { acutPrintf("\n Cannot set layout name"); return E_FAIL; } CComBSTR bstrDwgName(layoutDwgPath); // layout drawing name // Set layout drawing name if(FAILED(pLayoutRef->SetFileName(bstrDwgName))) { acutPrintf("\n Cannot set layout drawing name"); return E_FAIL; } // Import the sheet into the sheet set by passing the // IAcSmNamedAcDbObjectReference // - which is a SheetSet reference to a layout if(FAILED(pSubSet->ImportSheet(pLayoutRef, pNewSheet))) { acutPrintf("\n Failed to import sheet %s", layoutDwgPath); return E_FAIL; } // insert the component(sheet) if(FAILED(pSubSet->InsertComponent(*pNewSheet, NULL))) { acutPrintf("\n Failed to insert sheet"); return E_FAIL; } } // set the sheet number. CString sFormat; sFormat.Format("%d", m_nSheetCount + 1); CComBSTR bstrSheetNumber = sFormat.AllocSysString(); if(pNewSheet && FAILED((*pNewSheet)->SetNumber(bstrSheetNumber))) { acutPrintf("\n Failed to set sheet number"); return E_FAIL; } // Increment sheet count m_nSheetCount++; // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
HRESULT AsdkSheetSet::create(char* name, char* path, char* description, char* templPath, char* defSheetLoc) { BOOL bAlwaysCreate = TRUE; CComBSTR bstrSSName(name); // Sheet set name HRESULT hr; // If sheet set manager doesnt exist, create one if(!m_pSSetMgr.p) { if (FAILED(m_pSSetMgr.CoCreateInstance(CLSID_AcSmSheetSetMgr))) { acutPrintf("\n Error Cannot get sheet set manager!!"); return E_FAIL; } } char fullPath[255]; strcpy(fullPath, path); // If no trailing backslash entered, add it if (strcmp("\\" , &fullPath[strlen(fullPath)-1]) != 0) strcat(fullPath, "\\"); // check if folder exists if(_access(fullPath,0)) { acutPrintf("\n Error: Folder does not exist. Specify another folder!!!"); return E_FAIL; } if(!strstr(name,".dst")) strcat(name, ".dst"); strcat(fullPath, name); CComBSTR bstrPath(fullPath); AcSmLockStatus lockStatus; // check if file exists // If so, ask the user whether to overwrite or open existing if(!_access(fullPath,0)) { if(!getYorN("\n File exists!! Overwrite existing?")) { // Don't overwrite existing // Just open the file // 2nd parameter = FALSE means don't fail if already open if(FAILED(m_pSSetMgr->OpenDatabase(bstrPath, FALSE, &m_pDb))) { acutPrintf("\n Error: Cannot open database!!"); return E_FAIL; } // get the sheet set from the database. if (FAILED(m_pDb->GetSheetSet(&m_pSheetSet))) { acutPrintf("\n Error: Cannot get sheet set"); return E_FAIL; } return E_ABORT; } } // create the database for the sheet set // bAlwaysCreate lets you override the existing file if it's set to true if (FAILED(hr = m_pSSetMgr->CreateDatabase(bstrPath, NULL, bAlwaysCreate, &m_pDb))) { acutPrintf("\nError: Cannot create database!"); if (E_INVALIDARG == hr) acutPrintf("\n File name invalid!"); return E_FAIL; } // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Error: Database lock failed!"); return E_FAIL; } CComBSTR bstrDesc(description); // set the sheet set db name, description = sheet set name, description if (FAILED(m_pDb->SetName(bstrSSName))) { acutPrintf("\n Error: Cannot set database name"); return E_FAIL; } if (FAILED(m_pDb->SetDesc(bstrDesc))) { acutPrintf("\nError: Cannot set database description!"); return E_FAIL; } // get the sheet set from the database. if (FAILED(m_pDb->GetSheetSet(&m_pSheetSet))) { acutPrintf("\n Error: Cannot get sheet set"); return E_FAIL; } // set the name and description to the sheet set if (FAILED(m_pSheetSet->SetName(bstrSSName))) { acutPrintf("\nError: Cannot set name!"); return E_FAIL; } if (FAILED(m_pSheetSet->SetDesc(bstrDesc))) { acutPrintf("\nError: Cannot set description!"); return E_FAIL; } if(isValid(templPath)) { // set default template for layout at sheet set level overrideDefaultDWTLayout(templPath, m_pSheetSet); } if(isValid(defSheetLoc)) { // set default sheet location setNewSheetLocation(defSheetLoc, m_pSheetSet); } if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } else acutPrintf("\n Sheet set %s created", fullPath); return S_OK; }
/** Nahraje do databaze soubory ze zadaneho adresare. * Pokud uz v databazi nektery ze souboru je, nebude prepsan. * * Navratove hodnoty: * * - 1 vse OK. * - -1 chyba pri vytvareni klice k souboru * - -2 chyba pri zamykani/odemykani databaze * - -3 chyba pri praci s databazi * - -5 chyba pri otvirani adresare * */ int DirectoryDatabase::LoadSubDir(string &name) { DIR *dir; struct dirent *entry; int ret; if ((dir = opendir(name.c_str()) ) == 0) { // string msg; // msg = "Adresar " + name + " nebylo mozne otevrit."; return -5; } string tmp; string key; datum keyd, datad; FileInfoGdbmRecord file_record; //data, ktera budou ulozena do databaze // --- zacatek KRITICKE SEKCE --- if (LockDatabase() != 1) return -2; gdbm_close(db_file); // otevreme databazi pro zapis db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_WRITER, S_IRUSR | S_IWUSR, 0); if (db_file == 0) { UnlockDatabase(); return -3; } while ((entry = readdir(dir)) != 0) { tmp = entry->d_name; if (tmp == "." || tmp == "..") continue; if (tmp.substr(0,1) == "." && ignore_hidden) continue; ret = File2Key(tmp.c_str(), key); if (ret != 1) return -1; keyd.dptr = (char *)key.c_str(); keyd.dsize = key.size(); file_record.user_name[0] = 0; strncpy(file_record.name, tmp.c_str(), MAX_FILE_NAME_LEN); file_record.name[MAX_FILE_NAME_LEN-1] = 0;// pro jistotu, kdyby byl nazev souboru moc dlouhy file_record.user_rights = R_ALL; file_record.others_rights = R_ALL; datad.dptr = (char *)&file_record; datad.dsize = sizeof(struct FileInfoGdbmRecord); #ifdef DD_DEBUG cout << getpid() << " - LoadSubDir ... storing " << file_record.name << " juzra: " << file_record.user_name << " with i-node# " << key << " rights = " << file_record.user_rights << " in da dejtabejz" << endl; #endif int err = gdbm_store(db_file, keyd, datad, GDBM_INSERT); if (err != 0 && gdbm_errno != GDBM_CANNOT_REPLACE) return -3; // pokud bychom prepsali data v databazi, mohli bychom prijit o // spravne udaje o pravech a juzrovi, proto store s GDBM_INSERT // pokud uz zaznam existuje hodi, hodi chybu GDBM_CANNOT_REPLACE, // definice kodu chyb je v /usr/inlcude/gdbm/gdbm.h } //while gdbm_close(db_file); if (UnlockDatabase() != 1) return -2; // --- konec KRITICKE SEKCE --- //otevreme databazi zpet pro cteni db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_READER, S_IRUSR | S_IWUSR, 0); if (db_file == 0) { UnlockDatabase(); return -3; } return 1; }
/** Ziska z databaze informace o zadanem souboru. * * Navratove hodnoty: * * - 1 vse OK. * - -1 chyba pri vytvareni klice k souboru * - -3 chyba pri praci s databazi * */ int DirectoryDatabase::GetFileInfo(string name, FileInfo &info) { string key; datum keyd, datad; int ret; ret = File2Key(name.c_str(), key); if (ret != 1) return -1; keyd.dptr = (char *) key.c_str(); keyd.dsize = key.size(); // --- zacatek KRITICKE SEKCE --- if (LockDatabase() != 1) return -2; // otevreme databazi pro cteni db_file = gdbm_open((char *)db_name.c_str(), GDBM_BLOCK_SIZE, GDBM_READER, S_IRUSR | S_IWUSR, 0); if (db_file == 0) { //nastala chyba #ifdef DD_DEBUG cout << getpid() << "DD::GFI open gdbm_errno = " << gdbm_errno << " ... " << gdbm_strerror(gdbm_errno) << endl; #endif UnlockDatabase(); return -3; } datad = gdbm_fetch(db_file, keyd); if (datad.dptr == 0) { #ifdef DD_DEBUG cout << getpid() << " - soubor " << name << " nebyl v databazi nalezen. "; cout << "gdbm_errno = " << gdbm_errno << " ... " << gdbm_strerror(gdbm_errno) << endl; #endif gdbm_close(db_file); UnlockDatabase(); return -3; } //databazi zase musime zavrit!!! aby ostatni procesy mohly cist a //zapisovat !!! gdbm_close(db_file); ret = UnlockDatabase(); if (ret != 1){ return -2; } // --- konec KRITICKE SEKCE --- FileInfoGdbmRecord record; memcpy(&record, datad.dptr, datad.dsize); //cout << "get file info: free(datad.dptr)" << endl; free(datad.dptr); // nutne uvolnit misto na ktere ukazuje datad.dptr --> gdbm to samo neudela!!! #ifdef DD_DEBUG cout << getpid() << " - GetFileInfo: ke klici " << key << "jsme dostali informace o " << record.name << endl; #endif FileInfo result; result = record; info = result; return 1; }
HRESULT AsdkSheetSet::addCustomProperty(char* key, // Property name char* value, // Property value IAcSmComponent *pComp, // Component to add custom properties to PropertyFlags propertyFlag) // Property flag which specifies // whether to inherit properties // for all sheets in the sheet set // or to only apply at sheet set level { if(FAILED(isInitialized("addCustomProperty"))) return E_FAIL; CComQIPtr<IAcSmComponent> pCmp; if (!pComp) // if null, create properties for sheet set pCmp = m_pSheetSet; else pCmp = pComp; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } // Add one custom property at the sheet set level CComPtr<IAcSmCustomPropertyBag> pBag = NULL; if(FAILED(pCmp->GetCustomPropertyBag(&pBag))) { acutPrintf("\nError: custom property bag."); return E_FAIL; } CComPtr<IAcSmCustomPropertyValue> pPropVal; if (FAILED(pPropVal.CoCreateInstance(L"AcSmComponents.AcSmCustomPropertyValue"))) { acutPrintf("\nError: initializing custom property."); return E_POINTER; } if(FAILED(pPropVal->InitNew(pBag))) { acutPrintf("\nError: initializing custom property value."); return E_FAIL; } HRESULT hr; // set the property flag. if(FAILED(( hr = pPropVal->SetFlags((PropertyFlags)propertyFlag)))) { acutPrintf("\nError: setting custom property flag."); return E_FAIL; } // set the property name(key) CComBSTR propName(key); if(FAILED(pBag->SetProperty(propName, pPropVal))) { acutPrintf("\nError: attaching custom property to sheet set."); return E_FAIL; } // set the property value(for the key) CComVariant val(value); if(FAILED(pPropVal->SetValue(val))) { acutPrintf("\nError: setting custom property value."); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }
ULONG GetAudioAttrsA( ULONG id, struct AHIPrivAudioCtrl* actrl, struct TagItem* tags, struct AHIBase* AHIBase ) { struct AHI_AudioDatabase *audiodb; struct TagItem *dbtags,*tag1,*tag2,*tstate=tags; ULONG *ptr; ULONG stringlen; struct Library *AHIsubBase=NULL; struct AHIAudioCtrlDrv *audioctrl=NULL; BOOL rc=TRUE; // TRUE == _everything_ went well struct TagItem idtag[2] = { {AHIA_AudioID, 0} , {TAG_DONE, 0} }; if(AHIBase->ahib_DebugLevel >= AHI_DEBUG_HIGH) { Debug_GetAudioAttrsA(id, actrl, tags); } if((audiodb=LockDatabase())) { if(id == AHI_INVALID_ID) { if(!(audioctrl= (struct AHIAudioCtrlDrv*) actrl)) rc=FALSE; else idtag[0].ti_Data=((struct AHIPrivAudioCtrl *)actrl)->ahiac_AudioID; } else { idtag[0].ti_Data = (id == AHI_DEFAULT_ID ? AHIBase->ahib_AudioMode : id); audioctrl=(struct AHIAudioCtrlDrv *)CreateAudioCtrl(idtag); } if(audioctrl && rc ) { if((dbtags=GetDBTagList(audiodb, idtag[0].ti_Data))) { stringlen=GetTagData(AHIDB_BufferLen,0,tags); if((AHIsubBase=OpenLibrary(((struct AHIPrivAudioCtrl *)audioctrl)->ahiac_DriverName,DriverVersion))) { while((tag1=NextTagItem(&tstate))) { ptr=(ULONG *)tag1->ti_Data; switch(tag1->ti_Tag) { case AHIDB_Driver: case AHIDB_Name: if((tag2=FindTagItem(tag1->ti_Tag,dbtags))) stccpy((char *)tag1->ti_Data,(char *)tag2->ti_Data,stringlen); break; // Skip these! case AHIDB_FrequencyArg: case AHIDB_IndexArg: case AHIDB_InputArg: case AHIDB_OutputArg: break; // Strings case AHIDB_Author: case AHIDB_Copyright: case AHIDB_Version: case AHIDB_Annotation: stccpy((char *)tag1->ti_Data,(char *)AHIsub_GetAttr(tag1->ti_Tag,0,(ULONG)"",dbtags,audioctrl),stringlen); break; // Input & Output strings case AHIDB_Input: stccpy((char *)tag1->ti_Data,(char *)AHIsub_GetAttr(tag1->ti_Tag, GetTagData(AHIDB_InputArg,0,tags), (ULONG) GetahiString(msgDefault),dbtags,audioctrl),stringlen); break; case AHIDB_Output: stccpy((char *)tag1->ti_Data,(char *)AHIsub_GetAttr(tag1->ti_Tag, GetTagData(AHIDB_OutputArg,0,tags), (ULONG) GetahiString(msgDefault),dbtags,audioctrl),stringlen); break; // Other case AHIDB_Bits: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,0,dbtags,audioctrl); break; case AHIDB_MaxChannels: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,128,dbtags,audioctrl); break; case AHIDB_MinMixFreq: *ptr=AHIsub_GetAttr(AHIDB_Frequency,0,0,dbtags,audioctrl); break; case AHIDB_MaxMixFreq: *ptr=AHIsub_GetAttr(AHIDB_Frequency,(AHIsub_GetAttr(AHIDB_Frequencies,1,0,dbtags,audioctrl)-1),0,dbtags,audioctrl); break; case AHIDB_Frequencies: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,1,dbtags,audioctrl); break; case AHIDB_Frequency: *ptr=AHIsub_GetAttr(tag1->ti_Tag,GetTagData(AHIDB_FrequencyArg,0,tags),0,dbtags,audioctrl); break; case AHIDB_Index: *ptr=AHIsub_GetAttr(tag1->ti_Tag,GetTagData(AHIDB_IndexArg,0,tags),0,dbtags,audioctrl); break; case AHIDB_MaxPlaySamples: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,audioctrl->ahiac_MaxBuffSamples,dbtags,audioctrl); break; case AHIDB_MaxRecordSamples: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,0,dbtags,audioctrl); break; case AHIDB_MinMonitorVolume: case AHIDB_MaxMonitorVolume: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,0x00000,dbtags,audioctrl); break; case AHIDB_MinInputGain: case AHIDB_MaxInputGain: case AHIDB_MinOutputVolume: case AHIDB_MaxOutputVolume: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,0x10000,dbtags,audioctrl); break; case AHIDB_Inputs: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,0,dbtags,audioctrl); break; case AHIDB_Outputs: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,1,dbtags,audioctrl); break; // Booleans that defaults to FALSE case AHIDB_Realtime: case AHIDB_Record: case AHIDB_FullDuplex: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,FALSE,dbtags,audioctrl); break; // Booleans that defaults to TRUE case AHIDB_PingPong: *ptr=AHIsub_GetAttr(tag1->ti_Tag,0,TRUE,dbtags,audioctrl); break; // Tags from the database. default: if((tag2=FindTagItem(tag1->ti_Tag,dbtags))) *ptr=tag2->ti_Data; break; } } } else // no AHIsubBase rc=FALSE; } else // no database taglist rc=FALSE; } else // no valid audioctrl rc=FALSE; if(id != AHI_INVALID_ID) AHIFreeVec(audioctrl); if(AHIsubBase) CloseLibrary(AHIsubBase); UnlockDatabase(audiodb); } else // unable to lock database rc=FALSE; if(AHIBase->ahib_DebugLevel >= AHI_DEBUG_HIGH) { KPrintF("=>%s\n", rc ? "TRUE" : "FALSE" ); } return (ULONG) rc; }
HRESULT AsdkSheetSet::overrideDefaultDWTLayout(char* templPath, IAcSmSubset *pSubSet) { if(FAILED(isInitialized("overrideDefaultDWTLayout"))) return E_FAIL; // lock the the database first before doing any operation on it if (FAILED(LockDatabase())) { acutPrintf("\n Database lock failed!"); return E_FAIL; } CComQIPtr<IAcSmSubset> pSub = pSubSet; if(!pSub.p) pSubSet = m_pSheetSet; // if a default layout exists, release it first if(pDefDwtLayoutRef.p) pDefDwtLayoutRef.Release(); // create the NamedAcDbObjectReference. if(FAILED(pDefDwtLayoutRef.CoCreateInstance(L"AcSmComponents.AcSmAcDbLayoutReference"))) { acutPrintf("\n Cannot create named object reference"); return E_FAIL; } if(FAILED(pDefDwtLayoutRef->InitNew(pSubSet))) { acutPrintf("\n Cannot initialize layout"); return E_FAIL; } // Set template path CComBSTR bstrDwtPath(templPath); // layout drawing name // Set layout drawing name if(FAILED(pDefDwtLayoutRef->SetFileName(bstrDwtPath))) { acutPrintf("\n Cannot set template path"); return E_FAIL; } // Override default drawing template at the subset level if(FAILED(pSubSet->SetDefDwtLayout(pDefDwtLayoutRef))) { acutPrintf("\n Cannot override template path"); return E_FAIL; } // Unlock database if (FAILED(UnlockDatabase())) { acutPrintf("\n Cannot unlock database"); return E_FAIL; } return S_OK; }