/* * delete a line. free up all associated memory and if the line * was not alloc-ed from a list, free up the line struct itself */ void line_delete(LINE line) { if (line == NULL) { return; } /* free up text space */ gmem_free(hHeap, line->text, lstrlen(line->text)+1); /* free up line itself only if not on list */ if (line->flags & LF_DISCARD) { gmem_free(hHeap, (LPSTR) line, sizeof(struct fileline)); } }
/* * free up all resources associated with a slm object. The SLMOBJECT is invalid * after this call. */ void SLM_Free(SLMOBJECT pSlm) { if (pSlm != NULL) { gmem_free(hHeap, (LPSTR) pSlm, sizeof(struct _slmobject)); } }
/* * create a slm object for the given directory. The pathname may include * a filename component. * If the directory is not enlisted in a SLM library, this will return NULL. * * Check that the directory is valid, and that we can open slm.ini, and * build a UNC path to the master source library before declaring everything * valid. */ SLMOBJECT SLM_New(LPSTR pathname) { SLMOBJECT pslm; char slmpath[MAX_PATH]; HFILE fh; BOOL bOK; LPSTR pfinal = NULL; pslm = (SLMOBJECT) gmem_get(hHeap, sizeof(struct _slmobject)); if (pslm == NULL) { return(NULL); } if (pathname == NULL) { pathname = "."; } /* * find the directory portion of the path. */ if (dir_isvaliddir(pathname)) { /* * its a valid directory as it is. */ lstrcpy(pslm->CurDir, pathname); } else { /* it's not a valid directory, perhaps because it has a filename on * the end. remove the final element and try again. */ pfinal = _fstrrchr(pathname, '\\'); if (pfinal == NULL) { /* * there is no backslash in this name and it is not a directory * - it can only be valid if it is a file in the current dir. * so create a current dir of '.' */ lstrcpy(pslm->CurDir, "."); // remember the final element in case it was a wild card pfinal = pathname; } else { /* * pfinal points to the final backslash. */ _fstrncpy(pslm->CurDir, pathname, pfinal - pathname); } } /* * look for slm.ini in the specified directory */ lstrcpy(slmpath, pslm->CurDir); if (pslm->CurDir[lstrlen(pslm->CurDir) -1] != '\\') { lstrcat(slmpath, "\\"); } lstrcat(slmpath, "slm.ini"); fh = _lopen(slmpath, 0); if (fh != -1) { bOK = SLM_ReadIni(pslm, fh); /* * if pfinal is not null, then it might be a *.* wildcard pattern * at the end of the path - if so, we should append it to the masterpath. */ if (pfinal && (_fstrchr(pfinal, '*') || _fstrchr(pfinal, '?'))) { if ( (pslm->MasterPath[lstrlen(pslm->MasterPath)-1] != '\\') && (pfinal[0] != '\\')) { lstrcat(pslm->MasterPath, "\\"); } lstrcat(pslm->MasterPath, pfinal); } _lclose(fh); } else { bOK = FALSE; } if (!bOK) { gmem_free(hHeap, (LPSTR) pslm, sizeof(struct _slmobject)); return(NULL); } else { return(pslm); } }
int lo_OnDataChange1(loUpdList *upl, OPCHANDLE hClient, unsigned cform, int with_time, IAdviseSink *ias, HGLOBAL *gmem, unsigned *hint_dsize) { HGLOBAL fakegmem = 0; unsigned hdrsize, totalsize, ihdr_size, datasize; unsigned ii, itcount = upl->used; loUpdList lup = *upl; ihdr_size = with_time? sizeof(OPCITEMHEADER1): sizeof(OPCITEMHEADER2); hdrsize = sizeof(OPCGROUPHEADER) + itcount * ihdr_size; datasize = 0; if (hint_dsize && *hint_dsize) datasize = *hint_dsize; else { for(ii = itcount; ii--;) { datasize += loVariantSize(&lup.variant[ii]); } if (hint_dsize) *hint_dsize = datasize; } totalsize = hdrsize + datasize; if (!gmem) gmem = &fakegmem; if (!gmem_realloc(gmem, totalsize)) { itcount = 0; hdrsize = sizeof(OPCGROUPHEADER); if (!gmem_realloc(gmem, hdrsize)) { UL_ERROR((LOGID, "%!L Trasaction %X ABORTED due gmem_alloc(%u)", lup.trqid, totalsize)); return -1; } UL_WARNING((LOGID, "%!L Trasaction %X Failed due gmem_alloc(%u)", lup.trqid, totalsize)); totalsize = hdrsize; lup.master_err = E_OUTOFMEMORY; } { char *glob, *glob0, *ihdr; OPCGROUPHEADER *gh; FILETIME faketime, *timest = &faketime; unsigned timest_inc = 0; glob = glob0 = (char*)GlobalLock(*gmem); gh = (OPCGROUPHEADER*)glob; ihdr = (char*)&gh[1]; glob += hdrsize; if (with_time) timest_inc = sizeof(OPCITEMHEADER1), timest = &((OPCITEMHEADER1*)ihdr)->ftTimeStampItem; gh->dwSize = totalsize; gh->dwItemCount = itcount; gh->hClientGroup = hClient; gh->dwTransactionID = lup.trqid; for(ii = 0; ii < itcount; ii++) { ((OPCITEMHEADER1*)ihdr)->wReserved = 0; ((OPCITEMHEADER1*)ihdr)->dwValueOffset = glob - glob0; ((OPCITEMHEADER1*)ihdr)->hClient = lup.opchandle[ii]; ((OPCITEMHEADER1*)ihdr)->wQuality = lup.quality[ii]; loVariantPack((void**)&glob, &lup.variant[ii]); *timest = lup.timestamp[ii]; timest = (FILETIME*)(((char*)timest) + timest_inc); ihdr += ihdr_size; } gh->hrStatus = lup.master_err != S_OK? lup.master_err: lup.master_qual; if ((unsigned)(glob - glob0) != totalsize) { UL_ERROR((LOGID, "Transaction:%X datasize mismatch %u %u", lup.trqid, glob - glob0, totalsize)); } GlobalUnlock(*gmem); } { STGMEDIUM stgm; FORMATETC form; form.cfFormat = cform; form.dwAspect = DVASPECT_CONTENT; form.ptd = NULL; form.tymed = TYMED_HGLOBAL; form.lindex = -1; stgm.tymed = TYMED_HGLOBAL; stgm.STGM_hGlobal = *gmem; stgm.pUnkForRelease = DUMMY_UNKNOWN; UL_DEBUG((LOGID, "OnDataChange1:%s-time(%u)...%p{ %X", with_time? "with": "without", itcount, ias, *gmem)); ias->OnDataChange(&form, &stgm); UL_DEBUG((LOGID, "OnDataChange()...}")); } gmem_free(&fakegmem); return FAILED(lup.master_err)? -1: 0; }
int lo_OnWriteComplete1(loUpdList *upl, OPCHANDLE hClient, unsigned cform, IAdviseSink *ias, HGLOBAL *gmem) { HGLOBAL fakegmem = 0; unsigned datasize; unsigned ii, itcount = upl->used; loUpdList lup = *upl; datasize = sizeof(OPCGROUPHEADERWRITE) + itcount * sizeof(OPCITEMHEADERWRITE); if (!gmem) gmem = &fakegmem; if (!gmem_realloc(gmem, datasize)) { itcount = 0; datasize = sizeof(OPCGROUPHEADERWRITE); if (!gmem_realloc(gmem, datasize)) { UL_ERROR((LOGID, "%!L Trasaction %X ABORTED due gmem_alloc(%u)", lup.trqid, datasize)); return -1; } UL_WARNING((LOGID, "%!L Trasaction %X Failed due gmem_alloc(%u)", lup.trqid, datasize)); lup.master_err = E_OUTOFMEMORY; } { OPCGROUPHEADERWRITE *gh; OPCITEMHEADERWRITE *ihdr; gh = (OPCGROUPHEADERWRITE*)GlobalLock(*gmem); ihdr = (OPCITEMHEADERWRITE*)&gh[1]; gh->dwItemCount = itcount; gh->hClientGroup = hClient; gh->dwTransactionID = lup.trqid; gh->hrStatus = lup.master_err; for(ii = 0; ii < itcount; ii++, ihdr++) { ihdr->hClient = lup.opchandle[ii]; ihdr->dwError = lup.errors[ii]; // UL_DEBUG((LOGID, "OnWriteComplete(%u : %X/%X)", itcount, ihdr->dwError, gh->hrStatus)); } if ((unsigned)((char*)ihdr - (char*)gh) != datasize) { UL_ERROR((LOGID, "Transaction:%X datasize mismatch %u %u", lup.trqid, (char*)ihdr - (char*)gh, datasize)); } UL_DEBUG((LOGID, "OnWriteComplete(%u : %X/%X)", itcount, gh->hrStatus, lup.master_err)); GlobalUnlock(*gmem); } { STGMEDIUM stgm; FORMATETC form; form.cfFormat = cform; form.dwAspect = DVASPECT_CONTENT; form.ptd = NULL; form.tymed = TYMED_HGLOBAL; form.lindex = -1; stgm.tymed = TYMED_HGLOBAL; stgm.STGM_hGlobal = *gmem; stgm.pUnkForRelease = DUMMY_UNKNOWN; ias->OnDataChange(&form, &stgm); UL_DEBUG((LOGID, "OnWriteComplete()...}")); } gmem_free(&fakegmem); return FAILED(lup.master_err)? -1: 0; }