static int restore_shmem_content(void *addr, struct shmem_info *si) { int fd, fd_pg, ret = 0; fd = open_image(CR_FD_SHMEM_PAGEMAP, O_RSTR, si->shmid); if (fd < 0) { fd_pg = open_image(CR_FD_SHM_PAGES_OLD, O_RSTR, si->shmid); if (fd_pg < 0) goto err_unmap; } else { fd_pg = open_pages_image(O_RSTR, fd); if (fd_pg < 0) goto out_close; } while (1) { unsigned long vaddr; unsigned nr_pages; if (fd >= 0) { PagemapEntry *pe; ret = pb_read_one_eof(fd, &pe, PB_PAGEMAP); if (ret <= 0) break; vaddr = (unsigned long)decode_pointer(pe->vaddr); nr_pages = pe->nr_pages; pagemap_entry__free_unpacked(pe, NULL); } else { __u64 img_vaddr; ret = read_img_eof(fd_pg, &img_vaddr); if (ret <= 0) break; vaddr = (unsigned long)decode_pointer(img_vaddr); nr_pages = 1; } if (vaddr + nr_pages * PAGE_SIZE > si->size) break; ret = read(fd_pg, addr + vaddr, nr_pages * PAGE_SIZE); if (ret != nr_pages * PAGE_SIZE) { ret = -1; break; } } close_safe(&fd_pg); close_safe(&fd); return ret; out_close: close_safe(&fd); err_unmap: munmap(addr, si->size); return -1; }
void SpeedDialSuggestionsModel::AddOpenTabs(BOOL items_under_parent_folder /*= FALSE*/, INT32 num_of_item_to_add /*= -1*/) { if (num_of_item_to_add == 0) return; INT32 open_pages_folder_idx = -1; // Add open tabs folder folder if (items_under_parent_folder) { OpString open_pages; RETURN_VOID_IF_ERROR(g_languageManager->GetString(Str::S_CURRENTLY_OPEN_PAGES, open_pages)); OpStringC8 open_pages_image("Open Pages"); open_pages_folder_idx = AddFolder(open_pages, open_pages_image); if (open_pages_folder_idx == -1) return; } // Get the title and url of last accessed open tabs (only from the active browser window) OpWorkspace* workspace = NULL; if (BrowserDesktopWindow* browser = g_application->GetActiveBrowserDesktopWindow()) workspace = browser->GetWorkspace(); if (!workspace) return; INT32 count = 0; for (INT32 i = 0; i < workspace->GetDesktopWindowCount() && count < num_of_item_to_add; i++) { DesktopWindow* window = workspace->GetDesktopWindowFromStack(i); if (window && window->GetType() == OpTypedObject::WINDOW_TYPE_DOCUMENT) { DocumentDesktopWindow* ddw = (DocumentDesktopWindow*)window; if (ddw->HasDocument() && !ddw->IsLockedByUser()) { OpString title, address; OpStatus::Ignore(title.Set(ddw->GetTitle(FALSE))); OpStatus::Ignore(WindowCommanderProxy::GetMovedToURL(ddw->GetWindowCommander()).GetAttribute(URL::KUniName_Username_Password_NOT_FOR_UI, address)); if (!DocumentView::IsUrlRestrictedForViewFlag(address.CStr(), DocumentView::ALLOW_ADD_TO_SPEED_DIAL)) continue; if (-1 != AddSuggestion(title, address, open_pages_folder_idx)) count ++; } } } if (count == 0 && items_under_parent_folder) { /* Add information on 'no pages currently open' only if 'items_under_parent_folder' is set to TRUE and tab count is 0. */ OpString no_items_label; RETURN_VOID_IF_ERROR(g_languageManager->GetString(Str::S_NO_PAGES_CURRENTLY_OPEN, no_items_label)); RETURN_VOID_IF_ERROR(AddLabel(no_items_label, open_pages_folder_idx)); } }