// eine neue Objekteigenschaft soll erzeugt werden STDMETHODIMP CFastdbFeatures::OnCreate (VARIANT Name, BSTR Type, FEATURETYPE rgType, ITRiASFeature **ppIFeat) { CHECKOUTPOINTER(ppIFeat); USES_CONVERSION; COM_TRY { // jetzt wirklich erzeugen CIID ClsId (Type, CIID::INITCIID_InitFromProgId); if (!ClsId) ClsId = CLSID_FastdbFeature; // default ClsId WTRiASFeatures BaseFeats; WDispatch Parent; THROW_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseFeats.ppi())); THROW_FAILED_HRESULT(BaseFeats -> get_Parent (Parent.ppi())); // Parent muß hier Objektklasse sein WTRiASObjects Objs; THROW_FAILED_HRESULT(Parent -> QueryInterface (Objs.ppi())); // neuen Satz erzeugen und zu der Objektklasse hinzufügen LONG lCursor (GetPropertyFrom (Objs, g_cbObjectsCursor, 0L)); _ASSERTE(0 != lCursor); dbDatabase *pdb = GetRelatedDatabase(GetUnknown()); dbCursor<CDBClass> cursor (pdb); CDBClass *pClass = cursor.at (dbReference<CDBClass>(oid_t(lCursor))); if (NULL == pClass || cursor.isEmpty()) THROW_FAILED_HRESULT(FASTDB_E_OBJECTS_BADREFERENCE); CComVariant vVal; CDBFeatureDesc FDesc; THROW_FAILED_HRESULT(vVal.ChangeType (VT_BSTR, &Name)); FDesc.m_pName = OLE2A(V_BSTR(&vVal)); FDesc.m_rgType = rgType; FDesc.objclass = cursor.currentId(); dbCursor<CDBFeatureDesc> featuredesc (GetRelatedDatabase(GetUnknown())); featuredesc.at (pdb -> insert (FDesc)); THROW_FAILED_HRESULT(SetupFeature (ClsId, BaseFeats, featuredesc, Parent, ppIFeat)); } COM_CATCH; return S_OK; }
HRESULT DatenBasisObjekt::DelPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); TX_ASSERT(NULL == pData -> pbdKText || TIsValidString(pData -> pbdKText)); // wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) && MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F)) { return S_FALSE; } TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize && 0 != ((PBDMERKMALEX *)pData) -> lIdent); // Ident muß gegeben sein // Feature entweder über Code oder Namen löschen CComVariant v; if (NULL == pData -> pbdKText) v = pData -> pbdCode; else v = pData -> pbdKText; // Wiederauffinden des Objects-Objektes WTRiASFeatures Feats; WTRiASObjects Objs; INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent; RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi())); // erstmal nachsehen, ob das Merkmal existiert bool fExists = false; { WTRiASFeature Feat; fExists = SUCCEEDED(Feats -> Item(v, Feat.ppi())) ? true : false; } if (fExists) { // nur löschen, wenns wirklich (noch) existiert) RETURN_FAILED_HRESULT(Feats -> Remove (v)); // Notifikation rumschicken DEXN_FeatureSetModified(lIdent); } return fExists ? S_OK : S_FALSE; // S_FALSE heißt 'existiert nicht' }
HRESULT DatenBasisObjekt::ModPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); USES_CONVERSION; { bool fForceTypeChange = (MPForceForTRiASDBs & ((PBDMERKMAL *)pData) -> ipbdMTyp) ? true : false; // wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) && (MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F)) && !fForceTypeChange) { return S_FALSE; } // Objekteigenschaft aus globaler Tabelle lesen WTRiASFeature Feat; HRESULT hr = S_OK; if (FAILED(GetFeatureFromMap (pData -> pbdCode, Feat))) { TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize); // Ident muß gegeben sein // Objekteigenschaft existiert nicht, also neu erzeugen TX_ASSERT(pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText); // KurzText muß gegeben sein // wiederauffinden des Objects-Objektes WTRiASObjects Objs; INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent; if (-1 == lIdent) { // wenn Ident nicht gegeben ist dann muß DataSource eine GeoDB sein TX_ASSERT(DB(hPr).IsTRiASDataSource()); lIdent = DEX_GetUnknownIdentEx(hPr); // den erstbesten verwenden } RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Feature (CComVariant(pData -> pbdCode), VARIANT_TRUE, CComBSTR(g_cbNil), Feat.ppi())); if (!fForceTypeChange) { RETURN_FAILED_HRESULT(Feat -> put_Name (CComBSTR(pData -> pbdKText))); // reales, vergebenes Handle zurückliefern INT_PTR lHandle = 0; RETURN_FAILED_HRESULT(Feat -> get_Handle (&lHandle)); if (lHandle != pData -> pbdCode) { TX_TRACE2("TRiAS: ModPbdDataMerkmal: Changed FeatureHandle %lx -> %lx !", pData -> pbdCode, lHandle); pData -> pbdCode = lHandle; } // Notifikation rumschicken DEXN_FeatureSetModified(lIdent); } } else if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) { #if defined(_DEBUG) // Testen, ob der gegebene MCode zur geforderten Datenquelle paßt if (HACTCONNECTION != hPr) { HPROJECT hPrTarget = NULL; RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Feat, &hPrTarget)); TX_ASSERT(hPrTarget == hPr); // Ident aus anderer Datenquelle ? } #endif // defined(_DEBUG) // hier nur neuen KurzText (Namen) einstellen if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) RETURN_FAILED_HRESULT(Feat -> put_Name (CComBSTR(pData -> pbdKText))); // Notifikation rumschicken INT_PTR lIdent = -1L; if (sizeof(PBDMERKMALEX) == pData -> dwSize) { lIdent = ((PBDMERKMALEX *)pData) -> lIdent; // sicherstellen, daß dieser MCode schon zu dem Ident gehört (#HK030111) if (-1 != lIdent) { // schlimmstenfalls liefert _Add S_FALSE (wenns schon dazugehört) WTRiASObjects Objs; WTRiASFeatures Feats; WTRiASFeature TestFeat; RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi())); if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) { // über den Namen gehts schneller if (S_OK != Feats -> Item (CComVariant(pData -> pbdKText), TestFeat.ppi())) { RETURN_FAILED_HRESULT(Feats -> _Add(Feat)); } } else { // kein Name gegeben, also Handle verwenden if (S_OK != Feats -> Item (CComVariant(pData -> pbdCode), TestFeat.ppi())) { RETURN_FAILED_HRESULT(Feats -> _Add(Feat)); } } } } DEXN_FeatureSetModified(lIdent); } if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) { // LangText (BeschreibungsInfo) einstellen if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) { RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(pData -> pbdLText))); } else { RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(g_cbNil))); } } // evtl. zusätzliche Infos speichern if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) { PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData; FEATURETYPE rgType = FEATURETYPE_Object; // Objektmerkmal if (fForceTypeChange) rgType = FEATURETYPE(pPbdM -> ipbdMTyp & 0x7f); // ggf. neuer Typ if (pPbdM -> ipbdMTyp & PBDMERKMAL_SYSTEMFLAG) rgType = FEATURETYPE(rgType | FEATURETYPE_System); if (pPbdM -> ipbdMTyp & PBDMERKMAL_READONLY) rgType = FEATURETYPE(rgType | FEATURETYPE_ReadOnly); RETURN_FAILED_HRESULT(Feat -> put_Type (rgType)); } } return S_OK; }