static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text, UINT code_page) { const char *ptr; LPWSTR *param, merge; int len; ptr = get_attr(text, "name", &len); if(!ptr) { WARN("name attr not found\n"); return; } if(!strncasecmp("name", ptr, len)) { param = &item->name; }else if(!strncasecmp("merge", ptr, len)) { param = &merge; }else if(!strncasecmp("local", ptr, len)) { param = &item->local; }else { WARN("unhandled param %s\n", debugstr_an(ptr, len)); return; } ptr = get_attr(text, "value", &len); if(!ptr) { WARN("value attr not found\n"); return; } /* * "merge" parameter data (referencing another CHM file) can be incorporated into the "local" parameter * by specifying the filename in the format: * MS-ITS:file.chm::/local_path.htm */ if(param == &item->local && strstr(ptr, "::")) { const char *local = strstr(ptr, "::")+2; int local_len = len-(local-ptr); item->local = decode_html(local, local_len, code_page); param = &merge; } *param = decode_html(ptr, len, code_page); if(param == &merge) { SetChmPath(&item->merge, hhc_root->merge.chm_file, merge); heap_free(merge); } }
/* Initialize the HTML Help Index tab */ void InitIndex(HHInfo *info) { IStream *stream; info->index = heap_alloc_zero(sizeof(IndexItem)); info->index->nItems = 0; SetChmPath(&info->index->merge, info->pCHMInfo->szFile, info->WinType.pszIndex); stream = GetChmStream(info->pCHMInfo, info->pCHMInfo->szFile, &info->index->merge); if(!stream) { TRACE("Could not get index stream\n"); return; } parse_hhindex(info, stream, info->index); IStream_Release(stream); fill_index_tree(info->tabs[TAB_INDEX].hwnd, info->index->next); }
void InitContent(HHInfo *info) { IStream *stream; insert_type_t insert_type; info->content = heap_alloc_zero(sizeof(ContentItem)); SetChmPath(&info->content->merge, info->pCHMInfo->szFile, info->WinType.pszToc); stream = GetChmStream(info->pCHMInfo, info->pCHMInfo->szFile, &info->content->merge); if(!stream) { TRACE("Could not get content stream\n"); return; } info->content->child = parse_hhc(info, stream, info->content, &insert_type); IStream_Release(stream); set_item_parents(NULL, info->content); fill_content_tree(info->tabs[TAB_CONTENTS].hwnd, NULL, info->content); }
BOOL NavigateToUrl(HHInfo *info, LPCWSTR surl) { ChmPath chm_path; BOOL ret; HRESULT hres; static const WCHAR url_indicator[] = {':', '/', '/', 0}; TRACE("%s\n", debugstr_w(surl)); if (strstrW(surl, url_indicator)) { hres = navigate_url(info, surl); if(SUCCEEDED(hres)) return TRUE; } /* look up in chm if it doesn't look like a full url */ SetChmPath(&chm_path, info->pCHMInfo->szFile, surl); ret = NavigateToChm(info, chm_path.chm_file, chm_path.chm_index); heap_free(chm_path.chm_file); heap_free(chm_path.chm_index); return ret; }