X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=filetree_type.ml;h=285677f6f415d3db388ce89d522fdfa7ed8a6e84;hb=refs%2Ftags%2F0.1.7;hp=f39137e25ce9f60a115a661aeb3b187da307b355;hpb=e0047b09f88dcfa6dd9e771caf57a744095321f2;p=guestfs-browser.git diff --git a/filetree_type.ml b/filetree_type.ml index f39137e..285677f 100644 --- a/filetree_type.ml +++ b/filetree_type.ml @@ -18,6 +18,8 @@ open Utils +open Slave_types + (* See struct/field description in .mli file. *) type t = { view : GTree.view; @@ -47,10 +49,10 @@ and content_t = | Loading | ErrorMessage of string | Info of string - | Top of Slave.source - | TopWinReg of Slave.source * string * string * string - | Directory of Slave.direntry - | File of Slave.direntry + | Top of source + | TopWinReg of source * string * string * string + | Directory of direntry + | File of direntry | RegKey of Hivex.node | RegValue of Hivex.value @@ -92,7 +94,8 @@ let find_child_node_by_content ({ model = model } as t) row c = * \_ Directory * \_ Loading <--- you are here * - * Note this function cannot be called on registry keys. + * Note this function cannot be called on registry keys. See + * {!get_registry_path} for that. *) let rec get_pathname ({ model = model } as t) row = let hdata = get_hdata t row in @@ -103,8 +106,8 @@ let rec get_pathname ({ model = model } as t) row = get_pathname t parent | { state=IsLeaf; content=(Loading|ErrorMessage _|Info _) }, None -> assert false - | { content=Directory { Slave.dent_name = name }}, Some parent - | { content=File { Slave.dent_name = name }}, Some parent -> + | { content=Directory { dent_name = name }}, Some parent + | { content=File { dent_name = name }}, Some parent -> let src, parent_name = get_pathname t parent in let path = if parent_name = "/" then "/" ^ name @@ -119,3 +122,67 @@ let rec get_pathname ({ model = model } as t) row = | { content=TopWinReg _ }, _ -> assert false | { content=RegKey _ }, _ -> assert false | { content=RegValue _ }, _ -> assert false + +(* Search up to the top of the tree from a registry key. + * + * The path up the tree will always look something like: + * TopWinReg + * \_ RegKey + * \_ RegKey <--- you are here + * \_ Loading <--- or here + * + * Note this function cannot be called on ordinary paths. Use + * {!get_pathname} for that. + *) +let rec get_registry_path ({ model = model } as t) row = + let hdata = get_hdata t row in + let parent = model#iter_parent row in + + match hdata, parent with + | { state=IsLeaf; content=(Loading|ErrorMessage _|Info _) }, Some parent -> + get_registry_path t parent + | { state=IsLeaf; content=(Loading|ErrorMessage _|Info _) }, None -> + assert false + | { content=RegKey node; hiveh = Some h }, Some parent -> + let top, path = get_registry_path t parent in + let path = Hivex.node_name h node :: path in + top, path + | { content=TopWinReg (a,b,c,d) }, None -> (a,b,c,d), [] + | { content=TopWinReg _ }, _ -> assert false + | { content=RegKey _}, _ -> assert false + | { content=Top _ }, _ -> assert false + | { content=Directory _ }, _ -> assert false + | { content=File _ }, _ -> assert false + | { content=Loading }, _ -> assert false + | { content=ErrorMessage _ }, _ -> assert false + | { content=Info _ }, _ -> assert false + | { content=RegValue _ }, _ -> assert false + +let rec cache_registry_file ?fail t path src remotefile cachefile cb = + Slave.download_file_if_not_exist ?fail src remotefile cachefile + (when_cached_registry ?fail t path cb) + +and when_cached_registry ?fail ({ model = model } as t) path cb () = + debug "when_cached_registry"; + let row = model#get_iter path in + let hdata = get_hdata t row in + + match hdata with + | { hiveh=Some _; content=TopWinReg _ } -> + (* Hive handle already opened. *) + cb () + + | { hiveh=None; content=TopWinReg (src, rootkey, remotefile, cachefile) } -> + (* Hive handle not opened, open it and save it in the handle. *) + (try + let flags = if verbose () then [ Hivex.OPEN_VERBOSE ] else [] in + let h = Hivex.open_file cachefile flags in + hdata.hiveh <- Some h; + cb () + with + Hivex.Error _ as exn -> + match fail with + | Some fail -> fail exn + | None -> raise exn + ) + | _ -> assert false