Merge mozilla-central to build-system.

This commit is contained in:
Mitchell Field 2011-04-19 13:22:32 +10:00
Родитель 83d4229f66 7cbaef1a8d
Коммит f2222cf176
387 изменённых файлов: 13537 добавлений и 8841 удалений

Просмотреть файл

@ -89,7 +89,7 @@ nsOuterDocAccessible::GetChildAtPoint(PRInt32 aX, PRInt32 aY,
nsAccessible* child = GetChildAt(0);
NS_ENSURE_TRUE(child, nsnull);
if (aWhichChild = eDeepestChild)
if (aWhichChild == eDeepestChild)
return child->GetChildAtPoint(aX, aY, eDeepestChild);
return child;
}

Просмотреть файл

@ -310,7 +310,7 @@ nsHyperTextAccessible::GetPosAndText(PRInt32& aStartOffset, PRInt32& aEndOffset,
*aEndFrame = nsnull;
}
if (aBoundsRect) {
aBoundsRect->Empty();
aBoundsRect->SetEmpty();
}
if (aStartAcc)
*aStartAcc = nsnull;

Просмотреть файл

@ -3296,16 +3296,15 @@ const BrowserSearch = {
win.BrowserSearch.webSearch();
} else {
// If there are no open browser windows, open a new one
// This needs to be in a timeout so that we don't end up refocused
// in the url bar
function webSearchCallback() {
setTimeout(BrowserSearch.webSearch, 0);
function observer(subject, topic, data) {
if (subject == win) {
BrowserSearch.webSearch();
Services.obs.removeObserver(observer, "browser-delayed-startup-finished");
}
}
win = window.openDialog("chrome://browser/content/", "_blank",
"chrome,all,dialog=no", "about:blank");
win.addEventListener("load", webSearchCallback, false);
Services.obs.addObserver(observer, "browser-delayed-startup-finished", false);
}
return;
}
@ -4034,16 +4033,19 @@ var FullScreen = {
// controls on nav bar.
var fullscreenflex = document.getElementById("fullscreenflex");
var fullscreenctls = document.getElementById("window-controls");
var ctlsOnTabbar = TabsOnTop.enabled &&
!gPrefService.getBoolPref("browser.tabs.autoHide");
if (fullscreenctls.parentNode.id == "nav-bar" && ctlsOnTabbar) {
var navbar = document.getElementById("nav-bar");
var ctlsOnTabbar = window.toolbar.visible &&
(navbar.collapsed ||
(TabsOnTop.enabled &&
!gPrefService.getBoolPref("browser.tabs.autoHide")));
if (fullscreenctls.parentNode == navbar && ctlsOnTabbar) {
document.getElementById("TabsToolbar").appendChild(fullscreenctls);
// we don't need this space in tabs-on-top mode, so prevent it from
// being shown
fullscreenflex.removeAttribute("fullscreencontrol");
}
else if (fullscreenctls.parentNode.id == "TabsToolbar" && !ctlsOnTabbar) {
document.getElementById("nav-bar").appendChild(fullscreenctls);
navbar.appendChild(fullscreenctls);
fullscreenflex.setAttribute("fullscreencontrol", "true");
}

Просмотреть файл

@ -96,8 +96,7 @@ let gOpenLocationLastURL = {
}
},
reset: function() {
if (prefSvc.prefHasUserValue(LAST_URL_PREF))
prefSvc.clearUserPref(LAST_URL_PREF);
prefSvc.clearUserPref(LAST_URL_PREF);
gOpenLocationLastURLData = "";
}
};

Просмотреть файл

@ -814,7 +814,7 @@
}
} catch (e) {}
if (window.TabView) {
if ("TabView" in window) {
let groupName = TabView.getActiveGroupName();
if (groupName)
newTitle = groupName + sep + newTitle;
@ -828,7 +828,7 @@
<method name="updateTitlebar">
<body>
<![CDATA[
if (window.TabView && TabView.isVisible()) {
if ("TabView" in window && TabView.isVisible()) {
// ToDo: this will be removed when we gain ability to draw to the menu bar.
// Bug 586175
this.ownerDocument.title = TabView.windowTitle;

Просмотреть файл

@ -1147,7 +1147,9 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
let $icon = iQ(icon);
if ($icon.data("xulTab") == event.target) {
$icon.attr("src", Utils.defaultFaviconURL);
return false;
}
return true;
});
},
@ -1193,9 +1195,10 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
iQ(".appTabIcon", this.$appTabTray).each(function(icon) {
let $icon = iQ(icon);
if ($icon.data("xulTab") != xulTab)
return;
return true;
$icon.remove();
return false;
});
// adjust the tray
@ -1215,7 +1218,7 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
elements.each(function(icon) {
let $icon = iQ(icon);
if ($icon.data("xulTab") != xulTab)
return;
return true;
let targetIndex = xulTab._tPos;
@ -1226,6 +1229,7 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
iQ(".appTabIcon:nth-child(" + (targetIndex + 1) + ")", self.$appTabTray)[0]);
else
$icon.appendTo(self.$appTabTray);
return false;
});
},
@ -1668,13 +1672,12 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
// Create new tab and zoom in on it after a double click
container.mousedown(function(e) {
if (!Utils.isLeftClick(e))
if (!Utils.isLeftClick(e) || self.$titlebar[0] == e.target ||
self.$titlebar.contains(e.target)) {
self._lastClick = 0;
self._lastClickPositions = null;
return;
// clicking in the title bar shouldn't create new tabs
if (self.$titlebar[0] == e.target || self.$titlebar.contains(e.target))
return;
}
if (Date.now() - self._lastClick <= UI.DBLCLICK_INTERVAL &&
(self._lastClickPositions.x - UI.DBLCLICK_OFFSET) <= e.clientX &&
(self._lastClickPositions.x + UI.DBLCLICK_OFFSET) >= e.clientX &&
@ -2038,10 +2041,11 @@ let GroupItems = {
iQ(".appTabIcon", groupItem.$appTabTray).each(function(icon) {
let $icon = iQ(icon);
if ($icon.data("xulTab") != xulTab)
return;
return true;
if (iconUrl != $icon.attr("src"))
$icon.attr("src", iconUrl);
return false;
});
});
},

Просмотреть файл

@ -217,9 +217,7 @@ iQClass.prototype = {
Utils.assert(false, "each's argument must be a function");
return null;
}
for (let i = 0; this[i] != null; i++) {
callback(this[i]);
}
for (let i = 0; this[i] != null && callback(this[i]) !== false; i++) {}
return this;
},

Просмотреть файл

@ -661,7 +661,7 @@ Item.prototype = {
.unbind('mousemove', handleMouseMove)
.unbind('mouseup', handleMouseUp);
if (dropTarget) {
if (startSent && dropTarget) {
var dropOptions = dropTarget.dropOptions;
if (dropOptions && typeof dropOptions.drop == "function")
dropOptions.drop.apply(dropTarget, [e]);

Просмотреть файл

@ -13,6 +13,7 @@ body {
}
#content {
overflow: -moz-hidden-unscrollable;
position: absolute;
top: 0;
left: 0;

Просмотреть файл

@ -183,36 +183,41 @@ let UI = {
});
}
if (e.originalTarget.id == "content") {
// Create an orphan tab on double click
if (Date.now() - self._lastClick <= self.DBLCLICK_INTERVAL &&
(self._lastClickPositions.x - self.DBLCLICK_OFFSET) <= e.clientX &&
(self._lastClickPositions.x + self.DBLCLICK_OFFSET) >= e.clientX &&
(self._lastClickPositions.y - self.DBLCLICK_OFFSET) <= e.clientY &&
(self._lastClickPositions.y + self.DBLCLICK_OFFSET) >= e.clientY) {
GroupItems.setActiveGroupItem(null);
TabItems.creatingNewOrphanTab = true;
let newTab =
gBrowser.loadOneTab("about:blank", { inBackground: true });
let box =
new Rect(e.clientX - Math.floor(TabItems.tabWidth/2),
e.clientY - Math.floor(TabItems.tabHeight/2),
TabItems.tabWidth, TabItems.tabHeight);
newTab._tabViewTabItem.setBounds(box, true);
newTab._tabViewTabItem.pushAway(true);
UI.setActiveTab(newTab._tabViewTabItem);
TabItems.creatingNewOrphanTab = false;
newTab._tabViewTabItem.zoomIn(true);
if (!Utils.isLeftClick(e)) {
self._lastClick = 0;
self._lastClickPositions = null;
gTabView.firstUseExperienced = true;
} else {
self._lastClick = Date.now();
self._lastClickPositions = new Point(e.clientX, e.clientY);
self._createGroupItemOnDrag(e);
// Create an orphan tab on double click
if (Date.now() - self._lastClick <= self.DBLCLICK_INTERVAL &&
(self._lastClickPositions.x - self.DBLCLICK_OFFSET) <= e.clientX &&
(self._lastClickPositions.x + self.DBLCLICK_OFFSET) >= e.clientX &&
(self._lastClickPositions.y - self.DBLCLICK_OFFSET) <= e.clientY &&
(self._lastClickPositions.y + self.DBLCLICK_OFFSET) >= e.clientY) {
GroupItems.setActiveGroupItem(null);
TabItems.creatingNewOrphanTab = true;
let newTab =
gBrowser.loadOneTab("about:blank", { inBackground: true });
let box =
new Rect(e.clientX - Math.floor(TabItems.tabWidth/2),
e.clientY - Math.floor(TabItems.tabHeight/2),
TabItems.tabWidth, TabItems.tabHeight);
newTab._tabViewTabItem.setBounds(box, true);
newTab._tabViewTabItem.pushAway(true);
UI.setActiveTab(newTab._tabViewTabItem);
TabItems.creatingNewOrphanTab = false;
newTab._tabViewTabItem.zoomIn(true);
self._lastClick = 0;
self._lastClickPositions = null;
gTabView.firstUseExperienced = true;
} else {
self._lastClick = Date.now();
self._lastClickPositions = new Point(e.clientX, e.clientY);
self._createGroupItemOnDrag(e);
}
}
}
});

Просмотреть файл

@ -130,6 +130,7 @@ _BROWSER_FILES = \
browser_tabview_bug641802.js \
browser_tabview_bug644097.js \
browser_tabview_bug645653.js \
browser_tabview_bug649006.js \
browser_tabview_dragdrop.js \
browser_tabview_exit_button.js \
browser_tabview_expander.js \

Просмотреть файл

@ -4,84 +4,61 @@
let originalTab;
let orphanedTab;
let contentWindow;
let contentElement;
function test() {
waitForExplicitFinish();
window.addEventListener("tabviewshown", onTabViewWindowLoaded, false);
TabView.show();
}
function onTabViewWindowLoaded() {
window.removeEventListener("tabviewshown", onTabViewWindowLoaded, false);
contentWindow = document.getElementById("tab-view").contentWindow;
originalTab = gBrowser.visibleTabs[0];
test1();
showTabView(function() {
contentWindow = TabView.getContentWindow();
contentElement = contentWindow.document.getElementById("content");
originalTab = gBrowser.visibleTabs[0];
test1();
});
}
function test1() {
is(contentWindow.GroupItems.getOrphanedTabs().length, 0, "No orphaned tabs");
let onTabViewHidden = function() {
window.removeEventListener("tabviewhidden", onTabViewHidden, false);
let onTabViewShown = function() {
window.removeEventListener("tabviewshown", onTabViewShown, false);
is(contentWindow.GroupItems.getOrphanedTabs().length, 1,
whenTabViewIsHidden(function() {
showTabView(function() {
is(contentWindow.GroupItems.getOrphanedTabs().length, 1,
"An orphaned tab is created");
orphanedTab = contentWindow.GroupItems.getOrphanedTabs()[0].tab;
test2();
};
window.addEventListener("tabviewshown", onTabViewShown, false);
TabView.show();
};
window.addEventListener("tabviewhidden", onTabViewHidden, false);
});
});
// first click
EventUtils.sendMouseEvent(
{ type: "mousedown" }, contentWindow.document.getElementById("content"),
contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup" }, contentWindow.document.getElementById("content"),
contentWindow);
mouseClick(contentElement, 0);
// second click
EventUtils.sendMouseEvent(
{ type: "mousedown" }, contentWindow.document.getElementById("content"),
contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup" }, contentWindow.document.getElementById("content"),
contentWindow);
mouseClick(contentElement, 0);
}
function test2() {
let groupItem = createEmptyGroupItem(contentWindow, 300, 300, 200);
is(groupItem.getChildren().length, 0, "The group is empty");
let onTabViewHidden = function() {
window.removeEventListener("tabviewhidden", onTabViewHidden, false);
hideTabView(function() {
is(groupItem.getChildren().length, 1, "A tab is created inside the group");
gBrowser.selectedTab = originalTab;
gBrowser.removeTab(orphanedTab);
gBrowser.removeTab(groupItem.getChildren()[0].tab);
finish();
};
window.addEventListener("tabviewhidden", onTabViewHidden, false);
});
// first click
EventUtils.sendMouseEvent(
{ type: "mousedown" }, groupItem.container, contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup" }, groupItem.container, contentWindow);
mouseClick(groupItem.container, 0);
// second click
EventUtils.sendMouseEvent(
{ type: "mousedown" }, groupItem.container, contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup" }, groupItem.container, contentWindow);
mouseClick(groupItem.container, 0);
}
function mouseClick(targetElement, buttonCode) {
EventUtils.sendMouseEvent(
{ type: "mousedown", button: buttonCode }, targetElement, contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup", button: buttonCode }, targetElement, contentWindow);
}

Просмотреть файл

@ -0,0 +1,94 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
let contentWindow;
let contentElement;
let groupItem;
function test() {
waitForExplicitFinish();
registerCleanupFunction(function () {
hideTabView(function () {});
});
showTabView(function() {
contentWindow = TabView.getContentWindow();
contentElement = contentWindow.document.getElementById("content");
test1();
});
}
function test1() {
is(gBrowser.tabs.length, 1,
"Total number of tabs is 1 before right button double click");
// first click
mouseClick(contentElement, 2);
// second click
mouseClick(contentElement, 2);
is(gBrowser.tabs.length, 1,
"Total number of tabs is 1 after right button double click");
test2();
}
function test2() {
is(gBrowser.tabs.length, 1,
"Total number of tabs is 1 before left, right and left mouse clicks");
// first click
mouseClick(contentElement, 0);
// second click
mouseClick(contentElement, 2);
// third click
mouseClick(contentElement, 0);
is(gBrowser.tabs.length, 1,
"Total number of tabs is 1 before left, right and left mouse clicks");
test3();
}
function test3() {
ok(contentWindow.GroupItems.groupItems.length, 1, "Only one group item exists");
groupItem = contentWindow.GroupItems.groupItems[0];
is(groupItem.getChildren().length, 1,
"The number of tab items in the group is 1 before right button double click");
// first click
mouseClick(groupItem.container, 2);
// second click
mouseClick(groupItem.container, 2);
is(groupItem.getChildren().length, 1,
"The number of tab items in the group is 1 after right button double click");
test4();
}
function test4() {
is(groupItem.getChildren().length, 1,
"The number of tab items in the group is 1 before left, right, left mouse clicks");
// first click
mouseClick(groupItem.container, 0);
// second click
mouseClick(groupItem.container, 2);
// third click
mouseClick(groupItem.container, 0);
is(groupItem.getChildren().length, 1,
"The number of tab items in the group is 1 before left, right, left mouse clicks");
hideTabView(function() {
is(gBrowser.tabs.length, 1, "Total number of tabs is 1 after all tests");
finish();
});
}
function mouseClick(targetElement, buttonCode) {
EventUtils.sendMouseEvent(
{ type: "mousedown", button: buttonCode }, targetElement, contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup", button: buttonCode }, targetElement, contentWindow);
}

Просмотреть файл

@ -457,10 +457,7 @@ var MigrationWizard = {
var prefBranch = prefSvc.getBranch(null);
if (this._newHomePage == "DEFAULT") {
try {
prefBranch.clearUserPref("browser.startup.homepage");
}
catch (e) { }
prefBranch.clearUserPref("browser.startup.homepage");
}
else {
var str = Components.classes["@mozilla.org/supports-string;1"]

Просмотреть файл

@ -261,6 +261,14 @@ BrowserGlue.prototype = {
else if (data == "force-ui-migration") {
this._migrateUI();
}
else if (data == "force-distribution-customization") {
this._distributionCustomizer.applyPrefDefaults();
this._distributionCustomizer.applyCustomizations();
// To apply distribution bookmarks use "places-init-complete".
}
else if (data == "force-places-init") {
this._initPlaces();
}
break;
}
},

Просмотреть файл

@ -84,11 +84,11 @@ function searchHistory(aInput)
case "visited":
resultType = NHQO.RESULTS_AS_URI;
sortingMode = NHQO.SORT_BY_VISITCOUNT_DESCENDING;
break;
break;
case "lastvisited":
resultType = NHQO.RESULTS_AS_URI;
sortingMode = NHQO.SORT_BY_DATE_DESCENDING;
break;
break;
case "dayandsite":
resultType = NHQO.RESULTS_AS_DATE_SITE_QUERY;
break;
@ -105,7 +105,7 @@ function searchHistory(aInput)
if (aInput) {
query.searchTerms = aInput;
if (gHistoryGrouping != "visited" && gHistoryGrouping != "lastvisited") {
sortingMode = NHQO.SORT_BY_TITLE_ASCENDING;
sortingMode = NHQO.SORT_BY_FRECENCY_DESCENDING;
resultType = NHQO.RESULTS_AS_URI;
}
}

Просмотреть файл

@ -1,62 +1,20 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Places Unit Test code.
*
* The Initial Developer of the Original Code is Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Marco Bonardo <mak77@bonardo.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that nsBrowserGlue does not overwrite bookmarks imported from the
* migrators. They usually run before nsBrowserGlue, so if we find any
* bookmark on init, we should not try to import.
* Tests that nsBrowserGlue correctly imports bookmarks from distribution.ini.
*/
const PREF_SMART_BOOKMARKS_VERSION = "browser.places.smartBookmarksVersion";
const PREF_BMPROCESSED = "distribution.516444.bookmarksProcessed";
const PREF_DISTRIBUTION_ID = "distribution.id";
const TOPIC_FINAL_UI_STARTUP = "final-ui-startup";
const TOPICDATA_DISTRIBUTION_CUSTOMIZATION = "force-distribution-customization";
const TOPIC_CUSTOMIZATION_COMPLETE = "distribution-customization-complete";
const TOPIC_BROWSERGLUE_TEST = "browser-glue-test";
function run_test() {
// This is needed but we still have to investigate the reason, could just be
// we try to act too late in the game, moving our shutdown earlier will help.
let hs = Cc["@mozilla.org/browser/nav-history-service;1"].
getService(Ci.nsINavHistoryService);
// TODO: re-enable when bug 523936 is fixed.
return;
function run_test()
{
do_test_pending();
// Copy distribution.ini file to our app dir.
@ -68,82 +26,67 @@ function run_test() {
iniFile.remove(false);
print("distribution.ini already exists, did some test forget to cleanup?");
}
let testDistributionFile = gTestDir.clone();
testDistributionFile.append("distribution.ini");
testDistributionFile.copyTo(distroDir, "distribution.ini");
do_check_true(testDistributionFile.exists());
// Disable Smart Bookmarks creation.
let ps = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefBranch);
ps.setIntPref(PREF_SMART_BOOKMARKS_VERSION, -1);
// Avoid migrateUI, we are just simulating a partial startup.
ps.setIntPref("browser.migration.version", 4);
Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, -1);
// Initialize Places through the History Service.
let hs = Cc["@mozilla.org/browser/nav-history-service;1"].
getService(Ci.nsINavHistoryService);
// Check a new database has been created.
// nsBrowserGlue will use databaseStatus to manage initialization.
do_check_eq(hs.databaseStatus, hs.DATABASE_STATUS_CREATE);
// Initialize Places through the History Service and check that a new
// database has been created.
do_check_eq(PlacesUtils.history.databaseStatus,
PlacesUtils.history.DATABASE_STATUS_CREATE);
// Initialize nsBrowserGlue.
let bg = Cc["@mozilla.org/browser/browserglue;1"].
getService(Ci.nsIBrowserGlue);
// Force distribution.
Cc["@mozilla.org/browser/browserglue;1"].
getService(Ci.nsIObserver).observe(null,
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_DISTRIBUTION_CUSTOMIZATION);
let os = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
let observer = {
observe: function(aSubject, aTopic, aData) {
os.removeObserver(this, PlacesUtils.TOPIC_INIT_COMPLETE);
// Simulate browser startup.
bg.QueryInterface(Ci.nsIObserver).observe(null,
TOPIC_FINAL_UI_STARTUP,
null);
// Test will continue on customization complete notification.
let cObserver = {
observe: function(aSubject, aTopic, aData) {
os.removeObserver(this, TOPIC_CUSTOMIZATION_COMPLETE);
do_execute_soon(continue_test);
}
}
os.addObserver(cObserver, TOPIC_CUSTOMIZATION_COMPLETE, false);
}
}
os.addObserver(observer, PlacesUtils.TOPIC_INIT_COMPLETE, false);
// Test will continue on customization complete notification.
Services.obs.addObserver(function(aSubject, aTopic, aData) {
Services.obs.removeObserver(arguments.callee,
TOPIC_CUSTOMIZATION_COMPLETE,
false);
do_execute_soon(onCustomizationComplete);
}, TOPIC_CUSTOMIZATION_COMPLETE, false);
}
function continue_test() {
let bs = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
getService(Ci.nsINavBookmarksService);
dump_table("moz_bookmarks");
function onCustomizationComplete()
{
// Check the custom bookmarks exist on menu.
let menuItemId = bs.getIdForItemAt(bs.bookmarksMenuFolder, 0);
let menuItemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0);
do_check_neq(menuItemId, -1);
do_check_eq(bs.getItemTitle(menuItemId), "Menu Link Before");
menuItemId = bs.getIdForItemAt(bs.bookmarksMenuFolder, 1 + DEFAULT_BOOKMARKS_ON_MENU);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(menuItemId),
"Menu Link Before");
menuItemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId,
1 + DEFAULT_BOOKMARKS_ON_MENU);
do_check_neq(menuItemId, -1);
do_check_eq(bs.getItemTitle(menuItemId), "Menu Link After");
do_check_eq(PlacesUtils.bookmarks.getItemTitle(menuItemId),
"Menu Link After");
// Check the custom bookmarks exist on toolbar.
let toolbarItemId = bs.getIdForItemAt(bs.toolbarFolder, 0);
let toolbarItemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_neq(toolbarItemId, -1);
do_check_eq(bs.getItemTitle(toolbarItemId), "Toolbar Link Before");
toolbarItemId = bs.getIdForItemAt(bs.toolbarFolder, 1 + DEFAULT_BOOKMARKS_ON_TOOLBAR);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(toolbarItemId),
"Toolbar Link Before");
toolbarItemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
1 + DEFAULT_BOOKMARKS_ON_TOOLBAR);
do_check_neq(toolbarItemId, -1);
do_check_eq(bs.getItemTitle(toolbarItemId), "Toolbar Link After");
do_check_eq(PlacesUtils.bookmarks.getItemTitle(toolbarItemId),
"Toolbar Link After");
// Check the bmprocessed pref has been created.
let ps = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefBranch);
do_check_true(ps.getBoolPref(PREF_BMPROCESSED));
do_check_true(Services.prefs.getBoolPref(PREF_BMPROCESSED));
// Check distribution prefs have been created.
do_check_eq(ps.getCharPref(PREF_DISTRIBUTION_ID), "516444");
do_check_eq(Services.prefs.getCharPref(PREF_DISTRIBUTION_ID), "516444");
do_test_finished();
}

Просмотреть файл

@ -1,40 +1,5 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Places Unit Test code.
*
* The Initial Developer of the Original Code is Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Marco Bonardo <mak77@bonardo.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that nsBrowserGlue does not overwrite bookmarks imported from the
@ -42,39 +7,13 @@
* bookmark on init, we should not try to import.
*/
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "bs",
"@mozilla.org/browser/nav-bookmarks-service;1",
"nsINavBookmarksService");
XPCOMUtils.defineLazyServiceGetter(this, "anno",
"@mozilla.org/browser/annotation-service;1",
"nsIAnnotationService");
let bookmarksObserver = {
onBeginUpdateBatch: function() {},
onEndUpdateBatch: function() {
let itemId = bs.getIdForItemAt(bs.toolbarFolder, 0);
do_check_neq(itemId, -1);
if (anno.itemHasAnnotation(itemId, "Places/SmartBookmark"))
continue_test();
},
onItemAdded: function() {},
onBeforeItemRemoved: function(id) {},
onItemRemoved: function(id, folder, index, itemType) {},
onItemChanged: function() {},
onItemVisited: function(id, visitID, time) {},
onItemMoved: function() {},
QueryInterface: XPCOMUtils.generateQI([Ci.nsINavBookmarkObserver])
};
const PREF_SMART_BOOKMARKS_VERSION = "browser.places.smartBookmarksVersion";
function run_test() {
do_test_pending();
// Create our bookmarks.html copying bookmarks.glue.html to the profile
// folder. It will be ignored.
// folder. It should be ignored.
create_bookmarks_html("bookmarks.glue.html");
// Remove current database file.
@ -85,35 +24,61 @@ function run_test() {
do_check_false(db.exists());
}
// Initialize Places through the History Service.
let hs = Cc["@mozilla.org/browser/nav-history-service;1"].
getService(Ci.nsINavHistoryService);
// Check a new database has been created.
// nsBrowserGlue uses databaseStatus to manage initialization.
do_check_eq(hs.databaseStatus, hs.DATABASE_STATUS_CREATE);
// Initialize Places through the History Service and check that a new
// database has been created.
do_check_eq(PlacesUtils.history.databaseStatus,
PlacesUtils.history.DATABASE_STATUS_CREATE);
// A migrator would run before nsBrowserGlue, so we mimic that behavior
// adding a bookmark.
bs.insertBookmark(bs.bookmarksMenuFolder, uri("http://mozilla.org/"),
bs.DEFAULT_INDEX, "migrated");
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.bookmarksMenuFolder, uri("http://mozilla.org/"),
PlacesUtils.bookmarks.DEFAULT_INDEX, "migrated");
// Initialize nsBrowserGlue.
let bg = Cc["@mozilla.org/browser/browserglue;1"].
getService(Ci.nsIBrowserGlue);
let bookmarksObserver = {
onBeginUpdateBatch: function() {},
onEndUpdateBatch: function() {
// Check if the currently finished batch created the smart bookmarks.
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_neq(itemId, -1);
if (PlacesUtils.annotations
.itemHasAnnotation(itemId, "Places/SmartBookmark")) {
do_execute_soon(onSmartBookmarksCreation);
}
},
onItemAdded: function() {},
onBeforeItemRemoved: function(id) {},
onItemRemoved: function(id, folder, index, itemType) {},
onItemChanged: function() {},
onItemVisited: function(id, visitID, time) {},
onItemMoved: function() {},
QueryInterface: XPCOMUtils.generateQI([Ci.nsINavBookmarkObserver])
};
// The test will continue once import has finished and smart bookmarks
// have been created.
bs.addObserver(bookmarksObserver, false);
PlacesUtils.bookmarks.addObserver(bookmarksObserver, false);
}
function continue_test() {
function onSmartBookmarksCreation() {
// Check the created bookmarks still exist.
let itemId = bs.getIdForItemAt(bs.bookmarksMenuFolder, SMART_BOOKMARKS_ON_MENU);
do_check_eq(bs.getItemTitle(itemId), "migrated");
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId,
SMART_BOOKMARKS_ON_MENU);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "migrated");
// Check that we have not imported any new bookmark.
do_check_eq(bs.getIdForItemAt(bs.bookmarksMenuFolder, SMART_BOOKMARKS_ON_MENU + 1), -1);
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, SMART_BOOKMARKS_ON_MENU), -1);
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId,
SMART_BOOKMARKS_ON_MENU + 1)
do_check_eq(itemId, -1);
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
SMART_BOOKMARKS_ON_MENU)
do_check_eq(itemId, -1);
remove_bookmarks_html();

Просмотреть файл

@ -1,287 +1,265 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Places Unit Test code.
*
* The Initial Developer of the Original Code is Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Marco Bonardo <mak77@bonardo.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that nsBrowserGlue is correctly interpreting the preferences settable
* by the user or by other components.
*/
/** Bug 539067
* Test is disabled due to random failures and timeouts, see run_test.
* This is commented out to avoid leaks.
// Initialize browserGlue.
let bg = Cc["@mozilla.org/browser/browserglue;1"].
getService(Ci.nsIBrowserGlue);
*/
// Initialize Places through Bookmarks Service.
let bs = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
getService(Ci.nsINavBookmarksService);
// Get other services.
let ps = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefBranch);
let os = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
const PREF_IMPORT_BOOKMARKS_HTML = "browser.places.importBookmarksHTML";
const PREF_RESTORE_DEFAULT_BOOKMARKS = "browser.bookmarks.restore_default_bookmarks";
const PREF_SMART_BOOKMARKS_VERSION = "browser.places.smartBookmarksVersion";
const PREF_AUTO_EXPORT_HTML = "browser.bookmarks.autoExportHTML";
let tests = [];
//------------------------------------------------------------------------------
const TOPIC_BROWSERGLUE_TEST = "browser-glue-test";
const TOPICDATA_FORCE_PLACES_INIT = "force-places-init";
tests.push({
description: "Import from bookmarks.html if importBookmarksHTML is true.",
exec: function() {
let bg = Cc["@mozilla.org/browser/browserglue;1"].
getService(Ci.nsIBrowserGlue);
let gTests = [
// This test must be the first one.
function test_checkPreferences() {
// Initialize Places through the History Service and check that a new
// database has been created.
do_check_eq(PlacesUtils.history.databaseStatus,
PlacesUtils.history.DATABASE_STATUS_CREATE);
// Wait for Places init notification.
Services.obs.addObserver(function(aSubject, aTopic, aData) {
Services.obs.removeObserver(arguments.callee,
PlacesUtils.TOPIC_INIT_COMPLETE);
do_execute_soon(function () {
// Ensure preferences status.
do_check_false(Services.prefs.getBoolPref(PREF_AUTO_EXPORT_HTML));
try {
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_throw("importBookmarksHTML pref should not exist");
}
catch(ex) {}
try {
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
do_throw("importBookmarksHTML pref should not exist");
}
catch(ex) {}
run_next_test();
});
}, PlacesUtils.TOPIC_INIT_COMPLETE, false);
},
function test_import()
{
do_log_info("Import from bookmarks.html if importBookmarksHTML is true.");
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
Services.prefs.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
// Force nsBrowserGlue::_initPlaces().
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been imported, and a smart bookmark has been
// created.
let itemId = bs.getIdForItemAt(bs.toolbarFolder,
SMART_BOOKMARKS_ON_TOOLBAR);
do_check_eq(bs.getItemTitle(itemId), "example");
itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
SMART_BOOKMARKS_ON_TOOLBAR);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
// Check preferences have been reverted.
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
next_test();
}
});
run_next_test();
},
//------------------------------------------------------------------------------
function test_import_noSmartBookmarks()
{
do_log_info("import from bookmarks.html, but don't create smart bookmarks \
if they are disabled");
tests.push({
description: "import from bookmarks.html, but don't create smart bookmarks if they are disabled",
exec: function() {
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setIntPref(PREF_SMART_BOOKMARKS_VERSION, -1);
ps.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, -1);
Services.prefs.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
// Force nsBrowserGlue::_initPlaces().
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been imported, but smart bookmarks have not
// been created.
let itemId = bs.getIdForItemAt(bs.toolbarFolder, 0);
do_check_eq(bs.getItemTitle(itemId), "example");
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
// Check preferences have been reverted.
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
next_test();
}
});
run_next_test();
},
//------------------------------------------------------------------------------
function test_import_autoExport_updatedSmartBookmarks()
{
do_log_info("Import from bookmarks.html, but don't create smart bookmarks \
if autoExportHTML is true and they are at latest version");
tests.push({
description: "Import from bookmarks.html, but don't create smart bookmarks if autoExportHTML is true and they are at latest version",
exec: function() {
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 999);
ps.setBoolPref(PREF_AUTO_EXPORT_HTML, true);
ps.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 999);
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, true);
Services.prefs.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
// Force nsBrowserGlue::_initPlaces()
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been imported, but smart bookmarks have not
// been created.
let itemId = bs.getIdForItemAt(bs.toolbarFolder, 0);
do_check_eq(bs.getItemTitle(itemId), "example");
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
// Check preferences have been reverted.
ps.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
next_test();
}
});
run_next_test();
},
//------------------------------------------------------------------------------
function test_import_autoExport_oldSmartBookmarks()
{
do_log_info("Import from bookmarks.html, and create smart bookmarks if \
autoExportHTML is true and they are not at latest version.");
tests.push({
description: "Import from bookmarks.html, and create smart bookmarks if autoExportHTML is true and they are not at latest version.",
exec: function() {
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 0);
ps.setBoolPref(PREF_AUTO_EXPORT_HTML, true);
ps.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 0);
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, true);
Services.prefs.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
// Force nsBrowserGlue::_initPlaces()
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been imported, but smart bookmarks have not
// been created.
let itemId = bs.getIdForItemAt(bs.toolbarFolder, SMART_BOOKMARKS_ON_TOOLBAR);
do_check_eq(bs.getItemTitle(itemId), "example");
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
SMART_BOOKMARKS_ON_TOOLBAR);
do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "example");
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
// Check preferences have been reverted.
ps.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
Services.prefs.setBoolPref(PREF_AUTO_EXPORT_HTML, false);
next_test();
}
});
run_next_test();
},
//------------------------------------------------------------------------------
tests.push({
description: "restore from default bookmarks.html if restore_default_bookmarks is true.",
exec: function() {
function test_restore()
{
do_log_info("restore from default bookmarks.html if \
restore_default_bookmarks is true.");
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS, true);
Services.prefs.setBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS, true);
// Force nsBrowserGlue::_initPlaces()
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been restored.
let itemId = bs.getIdForItemAt(bs.toolbarFolder, SMART_BOOKMARKS_ON_TOOLBAR + 1);
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
SMART_BOOKMARKS_ON_TOOLBAR + 1);
do_check_true(itemId > 0);
// Check preferences have been reverted.
do_check_false(ps.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
next_test();
}
});
run_next_test();
},
//------------------------------------------------------------------------------
function test_restore_import()
{
do_log_info("setting both importBookmarksHTML and \
restore_default_bookmarks should restore defaults.");
tests.push({
description: "setting both importBookmarksHTML and restore_default_bookmarks should restore defaults.",
exec: function() {
remove_all_bookmarks();
// Sanity check: we should not have any bookmark on the toolbar.
do_check_eq(bs.getIdForItemAt(bs.toolbarFolder, 0), -1);
let itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
do_check_eq(itemId, -1);
// Set preferences.
ps.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
ps.setBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS, true);
Services.prefs.setBoolPref(PREF_IMPORT_BOOKMARKS_HTML, true);
Services.prefs.setBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS, true);
// Force nsBrowserGlue::_initPlaces()
print("Simulate Places init");
bg.QueryInterface(Ci.nsIObserver).observe(null,
PlacesUtils.TOPIC_INIT_COMPLETE,
null);
TOPIC_BROWSERGLUE_TEST,
TOPICDATA_FORCE_PLACES_INIT);
// Check bookmarks.html has been restored.
let itemId = bs.getIdForItemAt(bs.toolbarFolder, SMART_BOOKMARKS_ON_TOOLBAR + 1);
itemId =
PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId,
SMART_BOOKMARKS_ON_TOOLBAR + 1);
do_check_true(itemId > 0);
// Check preferences have been reverted.
do_check_false(ps.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_test_finished();
run_next_test();
}
});
//------------------------------------------------------------------------------
];
function finish_test() {
// Clean up database from all bookmarks.
do_register_cleanup(function () {
remove_all_bookmarks();
remove_bookmarks_html();
remove_all_JSON_backups();
});
do_test_finished();
}
var testIndex = 0;
function next_test() {
// Clean up database from all bookmarks.
remove_all_bookmarks();
// nsBrowserGlue stops observing topics after first notification,
// so we add back the observer to test additional runs.
os.addObserver(bg.QueryInterface(Ci.nsIObserver),
PlacesUtils.TOPIC_INIT_COMPLETE, false);
os.addObserver(bg.QueryInterface(Ci.nsIObserver),
PlacesUtils.TOPIC_DATABASE_LOCKED, false);
// Execute next test.
let test = tests.shift();
print("\nTEST " + (++testIndex) + ": " + test.description);
test.exec();
}
function run_test() {
// Bug 539067: disabled due to random failures and timeouts.
return;
do_test_pending();
// Enqueue test, so it will consume the default places-init-complete
// notification created at Places init.
do_timeout(0, start_tests);
}
function start_tests() {
// Clean up database from all bookmarks.
remove_all_bookmarks();
// Ensure preferences status.
do_check_false(ps.getBoolPref(PREF_AUTO_EXPORT_HTML));
try {
do_check_false(ps.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
do_throw("importBookmarksHTML pref should not exist");
}
catch(ex) {}
do_check_false(ps.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
function run_test()
{
// Create our bookmarks.html from bookmarks.glue.html.
create_bookmarks_html("bookmarks.glue.html");
// Create our JSON backup from bookmarks.glue.json.
create_JSON_backup("bookmarks.glue.json");
// Kick-off tests.
next_test();
run_next_test();
}

Просмотреть файл

@ -54,8 +54,7 @@ function test() {
function setupCleanSlate() {
gLastOpenDirectory.reset();
if (gPrefService.prefHasUserValue(kPrefName))
gPrefService.clearUserPref(kPrefName);
gPrefService.clearUserPref(kPrefName);
}
setupCleanSlate();

Просмотреть файл

@ -77,10 +77,7 @@ function test() {
// close tab, restore default values and finish the test
gBrowser.removeTab(tab);
// we need this if-statement because if there is no user set value,
// clearUserPref throws a uncatched exception and finish is not called
if (gPrefService.prefHasUserValue("browser.startup.page"))
gPrefService.clearUserPref("browser.startup.page");
gPrefService.clearUserPref("browser.startup.page");
gPrefService.clearUserPref("browser.startup.homepage");
finish();
}, true);

Просмотреть файл

@ -72,7 +72,11 @@ endif
DIRS += pgo
ifeq (Android,$(OS_TARGET))
DIRS += mobile/sutagent/android
DIRS += mobile/sutagent/android \
mobile/sutagent/android/watcher \
mobile/sutagent/android/ffxcp \
mobile/sutagent/android/fencp \
$(NULL)
endif
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -1,122 +1,215 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.net.ServerSocket;
import java.util.Timer;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
// import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.widget.Toast;
public class ASMozStub extends android.app.Service {
private ServerSocket cmdChnl = null;
private ServerSocket dataChnl = null;
private Handler handler = new Handler();
RunCmdThread runCmdThrd = null;
RunDataThread runDataThrd = null;
Thread monitor = null;
Timer timer = null;
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Listener Service created...", Toast.LENGTH_LONG).show();
}
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
try {
cmdChnl = new ServerSocket(20701);
runCmdThrd = new RunCmdThread(cmdChnl, this, handler);
runCmdThrd.start();
Toast.makeText(this, "Command channel port 20701 ...", Toast.LENGTH_LONG).show();
dataChnl = new ServerSocket(20700);
runDataThrd = new RunDataThread(dataChnl, this);
runDataThrd.start();
Toast.makeText(this, "Data channel port 20700 ...", Toast.LENGTH_LONG).show();
}
catch (Exception e) {
// Toast.makeText(getApplication().getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
return;
}
public void onDestroy()
{
super.onDestroy();
if (runCmdThrd.isAlive())
{
runCmdThrd.StopListening();
}
if (runDataThrd.isAlive())
{
runDataThrd.StopListening();
}
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1959);
Toast.makeText(this, "Listener Service destroyed...", Toast.LENGTH_LONG).show();
System.exit(0);
}
public void SendToDataChannel(String strToSend)
{
if (runDataThrd.isAlive())
{
runDataThrd.SendToDataChannel(strToSend);
}
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.util.Timer;
import com.mozilla.SUTAgentAndroid.R;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;
public class ASMozStub extends android.app.Service {
private ServerSocket cmdChnl = null;
private ServerSocket dataChnl = null;
private Handler handler = new Handler();
RunCmdThread runCmdThrd = null;
RunDataThread runDataThrd = null;
Thread monitor = null;
Timer timer = null;
@SuppressWarnings("unchecked")
private static final Class[] mStartForegroundSignature = new Class[] {
int.class, Notification.class};
@SuppressWarnings("unchecked")
private static final Class[] mStopForegroundSignature = new Class[] {
boolean.class};
private NotificationManager mNM;
private Method mStartForeground;
private Method mStopForeground;
private Object[] mStartForegroundArgs = new Object[2];
private Object[] mStopForegroundArgs = new Object[1];
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate() {
super.onCreate();
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
try {
mStartForeground = getClass().getMethod("startForeground", mStartForegroundSignature);
mStopForeground = getClass().getMethod("stopForeground", mStopForegroundSignature);
}
catch (NoSuchMethodException e) {
// Running on an older platform.
mStartForeground = mStopForeground = null;
}
doToast("Listener Service created...");
}
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
try {
cmdChnl = new ServerSocket(20701);
runCmdThrd = new RunCmdThread(cmdChnl, this, handler);
runCmdThrd.start();
doToast("Command channel port 20701 ...");
dataChnl = new ServerSocket(20700);
runDataThrd = new RunDataThread(dataChnl, this);
runDataThrd.start();
doToast("Data channel port 20700 ...");
Notification notification = new Notification();
startForegroundCompat(R.string.foreground_service_started, notification);
}
catch (Exception e) {
doToast(e.toString());
// Toast.makeText(getApplication().getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
return;
}
public void onDestroy()
{
super.onDestroy();
if (runCmdThrd.isAlive())
{
runCmdThrd.StopListening();
}
if (runDataThrd.isAlive())
{
runDataThrd.StopListening();
}
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1959);
stopForegroundCompat(R.string.foreground_service_started);
doToast("Listener Service destroyed...");
System.exit(0);
}
public void SendToDataChannel(String strToSend)
{
if (runDataThrd.isAlive())
runDataThrd.SendToDataChannel(strToSend);
}
public void doToast(String sMsg) {
Toast toast = Toast.makeText(this, sMsg, Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 100);
toast.show();
}
/**
* This is a wrapper around the new startForeground method, using the older
* APIs if it is not available.
*/
void startForegroundCompat(int id, Notification notification) {
// If we have the new startForeground API, then use it.
if (mStartForeground != null) {
mStartForegroundArgs[0] = Integer.valueOf(id);
mStartForegroundArgs[1] = notification;
try {
mStartForeground.invoke(this, mStartForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ScreenOnWidget", "Unable to invoke startForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ScreenOnWidget", "Unable to invoke startForeground", e);
}
return;
}
// Fall back on the old API.
setForeground(true);
mNM.notify(id, notification);
}
/**
* This is a wrapper around the new stopForeground method, using the older
* APIs if it is not available.
*/
void stopForegroundCompat(int id) {
// If we have the new stopForeground API, then use it.
if (mStopForeground != null) {
mStopForegroundArgs[0] = Boolean.TRUE;
try {
mStopForeground.invoke(this, mStopForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ScreenOnWidget", "Unable to invoke stopForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ScreenOnWidget", "Unable to invoke stopForeground", e);
}
return;
}
// Fall back on the old API. Note to cancel BEFORE changing the
// foreground state, since we could be killed at that point.
mNM.cancel(id);
setForeground(false);
}
}

Просмотреть файл

@ -1,96 +1,96 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.util.Timer;
import android.content.ContextWrapper;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
class AlertLooperThread extends Thread
{
public Handler mHandler;
private Looper looper = null;
private DoAlert da = null;
private Timer alertTimer = null;
private ContextWrapper contextWrapper = null;
AlertLooperThread(ContextWrapper ctxW)
{
this.contextWrapper = ctxW;
}
public Timer getAlertTimer()
{
return alertTimer;
}
public void term()
{
if (da != null)
da.term();
}
public void quit()
{
if (looper != null)
looper.quit();
}
public void run()
{
Looper.prepare();
looper = Looper.myLooper();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
// process incoming messages here
}
};
alertTimer = new Timer();
da = new DoAlert(contextWrapper);
alertTimer.scheduleAtFixedRate(da, 0, 5000);
Looper.loop();
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.util.Timer;
import android.content.ContextWrapper;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
class AlertLooperThread extends Thread
{
public Handler mHandler;
private Looper looper = null;
private DoAlert da = null;
private Timer alertTimer = null;
private ContextWrapper contextWrapper = null;
AlertLooperThread(ContextWrapper ctxW)
{
this.contextWrapper = ctxW;
}
public Timer getAlertTimer()
{
return alertTimer;
}
public void term()
{
if (da != null)
da.term();
}
public void quit()
{
if (looper != null)
looper.quit();
}
public void run()
{
Looper.prepare();
looper = Looper.myLooper();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
// process incoming messages here
}
};
alertTimer = new Timer();
da = new DoAlert(contextWrapper);
alertTimer.scheduleAtFixedRate(da, 0, 5000);
Looper.loop();
}
}

Просмотреть файл

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mozilla.SUTAgentAndroid"
android:versionCode="1"
android:versionName="1.0" android:sharedUserId="org.mozilla.sharedID">
android:versionCode="1" android:versionName="1.01">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".SUTAgentAndroid"
android:screenOrientation="nosensor"
@ -23,8 +22,7 @@
<action android:name="com.mozilla.SUTAgentAndroid.service.LISTENER_SERVICE" />
</intent-filter>
</service>
</application>
</application>
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="8"/>
@ -43,29 +41,17 @@
<uses-permission android:name="android.permission.DEVICE_POWER"></uses-permission>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"></uses-permission>
<uses-permission android:name="android.permission.STATUS_BAR"></uses-permission>
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
<uses-permission android:name="android.permission.SET_TIME"></uses-permission>
<uses-permission android:name="android.permission.SET_TIME_ZONE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"></uses-permission>
</manifest>

Просмотреть файл

@ -1,199 +1,199 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
// import com.mozilla.SUTAgentAndroid.DoCommand;
public class CmdWorkerThread extends Thread
{
private RunCmdThread theParent = null;
private Socket socket = null;
private String prompt = null;
boolean bListening = true;
public CmdWorkerThread(RunCmdThread theParent, Socket workerSocket)
{
super("CmdWorkerThread");
this.theParent = theParent;
this.socket = workerSocket;
byte pr [] = new byte [3];
pr[0] = '$';
pr[1] = '>';
pr[2] = 0;
prompt = new String(pr,0,3);
}
public void StopListening()
{
bListening = false;
}
private String readLine(BufferedInputStream in)
{
String sRet = "";
int nByte = 0;
char cChar = 0;
try
{
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar != '\r') && (cChar != '\n'))
sRet += cChar;
else
break;
nByte = in.read();
}
if ((in.available() > 0) && (cChar != '\n'))
{
in.mark(1024);
nByte = in.read();
if (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if (cChar != '\n')
{
in.reset();
}
}
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if (sRet.length() == 0)
sRet = null;
return(sRet);
}
public void run()
{
try {
OutputStream cmdOut = socket.getOutputStream();
InputStream cmdIn = socket.getInputStream();
PrintWriter out = new PrintWriter(cmdOut, true);
BufferedInputStream in = new BufferedInputStream(cmdIn);
String inputLine, outputLine;
DoCommand dc = new DoCommand(theParent.svc);
int nAvail = cmdIn.available();
cmdIn.skip(nAvail);
out.print(prompt);
out.flush();
while (bListening)
{
if (!(in.available() > 0))
{
socket.setSoTimeout(500);
try {
int nRead = cmdIn.read();
if (nRead == -1)
{
bListening = false;
continue;
}
else
{
inputLine = ((char)nRead) + "";
socket.setSoTimeout(120000);
}
}
catch(SocketTimeoutException toe)
{
continue;
}
}
else
inputLine = "";
if ((inputLine += readLine(in)) != null)
{
outputLine = dc.processCommand(inputLine, out, in, cmdOut);
if (outputLine.length() > 0)
{
out.print(outputLine + "\n" + prompt);
}
else
out.print(prompt);
out.flush();
if (outputLine.equals("exit"))
{
theParent.StopListening();
bListening = false;
}
if (outputLine.equals("quit"))
{
bListening = false;
}
outputLine = null;
System.gc();
}
else
break;
}
out.close();
out = null;
in.close();
in = null;
socket.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
// import com.mozilla.SUTAgentAndroid.DoCommand;
public class CmdWorkerThread extends Thread
{
private RunCmdThread theParent = null;
private Socket socket = null;
private String prompt = null;
boolean bListening = true;
public CmdWorkerThread(RunCmdThread theParent, Socket workerSocket)
{
super("CmdWorkerThread");
this.theParent = theParent;
this.socket = workerSocket;
byte pr [] = new byte [3];
pr[0] = '$';
pr[1] = '>';
pr[2] = 0;
prompt = new String(pr,0,3);
}
public void StopListening()
{
bListening = false;
}
private String readLine(BufferedInputStream in)
{
String sRet = "";
int nByte = 0;
char cChar = 0;
try
{
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar != '\r') && (cChar != '\n'))
sRet += cChar;
else
break;
nByte = in.read();
}
if ((in.available() > 0) && (cChar != '\n'))
{
in.mark(1024);
nByte = in.read();
if (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if (cChar != '\n')
{
in.reset();
}
}
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if (sRet.length() == 0)
sRet = null;
return(sRet);
}
public void run()
{
try {
OutputStream cmdOut = socket.getOutputStream();
InputStream cmdIn = socket.getInputStream();
PrintWriter out = new PrintWriter(cmdOut, true);
BufferedInputStream in = new BufferedInputStream(cmdIn);
String inputLine, outputLine;
DoCommand dc = new DoCommand(theParent.svc);
int nAvail = cmdIn.available();
cmdIn.skip(nAvail);
out.print(prompt);
out.flush();
while (bListening)
{
if (!(in.available() > 0))
{
socket.setSoTimeout(500);
try {
int nRead = cmdIn.read();
if (nRead == -1)
{
bListening = false;
continue;
}
else
{
inputLine = ((char)nRead) + "";
socket.setSoTimeout(120000);
}
}
catch(SocketTimeoutException toe)
{
continue;
}
}
else
inputLine = "";
if ((inputLine += readLine(in)) != null)
{
outputLine = dc.processCommand(inputLine, out, in, cmdOut);
if (outputLine.length() > 0)
{
out.print(outputLine + "\n" + prompt);
}
else
out.print(prompt);
out.flush();
if (outputLine.equals("exit"))
{
theParent.StopListening();
bListening = false;
}
if (outputLine.equals("quit"))
{
bListening = false;
}
outputLine = null;
System.gc();
}
else
break;
}
out.close();
out = null;
in.close();
in = null;
socket.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Просмотреть файл

@ -1,237 +1,237 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
// import com.mozilla.SUTAgentAndroid.DoCommand;
import com.mozilla.SUTAgentAndroid.SUTAgentAndroid;
public class DataWorkerThread extends Thread
{
private RunDataThread theParent = null;
private Socket socket = null;
boolean bListening = true;
PrintWriter out = null;
SimpleDateFormat sdf = null;
public DataWorkerThread(RunDataThread theParent, Socket workerSocket)
{
super("DataWorkerThread");
this.theParent = theParent;
this.socket = workerSocket;
this.sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss");
}
public void StopListening()
{
bListening = false;
}
public void SendString(String strToSend)
{
if (this.out != null)
{
Calendar cal = Calendar.getInstance();
String strOut = sdf.format(cal.getTime());
strOut += " " + strToSend + "\r\n";
out.write(strOut);
out.flush();
}
}
private String readLine(BufferedInputStream in)
{
String sRet = "";
int nByte = 0;
char cChar = 0;
try
{
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar != '\r') && (cChar != '\n'))
sRet += cChar;
else
break;
nByte = in.read();
}
if (in.available() > 0)
{
in.mark(1024);
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar == '\r') || (cChar == '\n'))
{
if (in.available() > 0)
{
in.mark(1024);
nByte = in.read();
}
else
nByte = -1;
}
else
{
in.reset();
break;
}
}
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if (sRet.length() == 0)
sRet = null;
return(sRet);
}
public void run()
{
String sRet = "";
long lEndTime = System.currentTimeMillis() + 60000;
try {
while(bListening)
{
OutputStream cmdOut = socket.getOutputStream();
InputStream cmdIn = socket.getInputStream();
this.out = new PrintWriter(cmdOut, true);
BufferedInputStream in = new BufferedInputStream(cmdIn);
String inputLine, outputLine;
DoCommand dc = new DoCommand(theParent.svc);
Calendar cal = Calendar.getInstance();
sRet = sdf.format(cal.getTime());
sRet += " trace output";
out.println(sRet);
out.flush();
int nAvail = cmdIn.available();
cmdIn.skip(nAvail);
while (bListening)
{
if (System.currentTimeMillis() > lEndTime)
{
cal = Calendar.getInstance();
sRet = sdf.format(cal.getTime());
sRet += " Thump thump - " + SUTAgentAndroid.sUniqueID + "\r\n";
out.write(sRet);
out.flush();
lEndTime = System.currentTimeMillis() + 60000;
}
if (!(in.available() > 0))
{
socket.setSoTimeout(500);
try {
int nRead = cmdIn.read();
if (nRead == -1)
{
bListening = false;
continue;
}
else
inputLine = (char)nRead + "";
}
catch(SocketTimeoutException toe)
{
continue;
}
}
else
inputLine = "";
if ((inputLine += readLine(in)) != null)
{
outputLine = dc.processCommand(inputLine, out, in, cmdOut);
out.print(outputLine + "\n");
out.flush();
if (outputLine.equals("exit"))
{
theParent.StopListening();
bListening = false;
}
if (outputLine.equals("quit"))
{
bListening = false;
}
outputLine = null;
System.gc();
}
else
break;
}
out.close();
out = null;
in.close();
in = null;
socket.close();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
// import com.mozilla.SUTAgentAndroid.DoCommand;
import com.mozilla.SUTAgentAndroid.SUTAgentAndroid;
public class DataWorkerThread extends Thread
{
private RunDataThread theParent = null;
private Socket socket = null;
boolean bListening = true;
PrintWriter out = null;
SimpleDateFormat sdf = null;
public DataWorkerThread(RunDataThread theParent, Socket workerSocket)
{
super("DataWorkerThread");
this.theParent = theParent;
this.socket = workerSocket;
this.sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss");
}
public void StopListening()
{
bListening = false;
}
public void SendString(String strToSend)
{
if (this.out != null)
{
Calendar cal = Calendar.getInstance();
String strOut = sdf.format(cal.getTime());
strOut += " " + strToSend + "\r\n";
out.write(strOut);
out.flush();
}
}
private String readLine(BufferedInputStream in)
{
String sRet = "";
int nByte = 0;
char cChar = 0;
try
{
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar != '\r') && (cChar != '\n'))
sRet += cChar;
else
break;
nByte = in.read();
}
if (in.available() > 0)
{
in.mark(1024);
nByte = in.read();
while (nByte != -1)
{
cChar = ((char)(nByte & 0xFF));
if ((cChar == '\r') || (cChar == '\n'))
{
if (in.available() > 0)
{
in.mark(1024);
nByte = in.read();
}
else
nByte = -1;
}
else
{
in.reset();
break;
}
}
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if (sRet.length() == 0)
sRet = null;
return(sRet);
}
public void run()
{
String sRet = "";
long lEndTime = System.currentTimeMillis() + 60000;
try {
while(bListening)
{
OutputStream cmdOut = socket.getOutputStream();
InputStream cmdIn = socket.getInputStream();
this.out = new PrintWriter(cmdOut, true);
BufferedInputStream in = new BufferedInputStream(cmdIn);
String inputLine, outputLine;
DoCommand dc = new DoCommand(theParent.svc);
Calendar cal = Calendar.getInstance();
sRet = sdf.format(cal.getTime());
sRet += " trace output";
out.println(sRet);
out.flush();
int nAvail = cmdIn.available();
cmdIn.skip(nAvail);
while (bListening)
{
if (System.currentTimeMillis() > lEndTime)
{
cal = Calendar.getInstance();
sRet = sdf.format(cal.getTime());
sRet += " Thump thump - " + SUTAgentAndroid.sUniqueID + "\r\n";
out.write(sRet);
out.flush();
lEndTime = System.currentTimeMillis() + 60000;
}
if (!(in.available() > 0))
{
socket.setSoTimeout(500);
try {
int nRead = cmdIn.read();
if (nRead == -1)
{
bListening = false;
continue;
}
else
inputLine = (char)nRead + "";
}
catch(SocketTimeoutException toe)
{
continue;
}
}
else
inputLine = "";
if ((inputLine += readLine(in)) != null)
{
outputLine = dc.processCommand(inputLine, out, in, cmdOut);
out.print(outputLine + "\n");
out.flush();
if (outputLine.equals("exit"))
{
theParent.StopListening();
bListening = false;
}
if (outputLine.equals("quit"))
{
bListening = false;
}
outputLine = null;
System.gc();
}
else
break;
}
out.close();
out = null;
in.close();
in = null;
socket.close();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Просмотреть файл

@ -1,81 +1,81 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.util.TimerTask;
import android.content.Context;
import android.content.ContextWrapper;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.widget.Toast;
class DoAlert extends TimerTask
{
int lcv = 0;
Toast toast = null;
Ringtone rt = null;
DoAlert(ContextWrapper contextWrapper)
{
Context ctx = contextWrapper.getApplicationContext();
this.toast = Toast.makeText(ctx, "Help me!", Toast.LENGTH_LONG);
rt = RingtoneManager.getRingtone(ctx, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
}
public void term()
{
if (rt != null)
{
if (rt.isPlaying())
rt.stop();
}
if (toast != null)
toast.cancel();
}
public void run ()
{
String sText =(((lcv++ % 2) == 0) ? "Help me!" : "I've fallen down!" );
toast.setText(sText);
toast.show();
if (rt != null)
rt.play();
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.util.TimerTask;
import android.content.Context;
import android.content.ContextWrapper;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.widget.Toast;
class DoAlert extends TimerTask
{
int lcv = 0;
Toast toast = null;
Ringtone rt = null;
DoAlert(ContextWrapper contextWrapper)
{
Context ctx = contextWrapper.getApplicationContext();
this.toast = Toast.makeText(ctx, "Help me!", Toast.LENGTH_LONG);
rt = RingtoneManager.getRingtone(ctx, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
}
public void term()
{
if (rt != null)
{
if (rt.isPlaying())
rt.stop();
}
if (toast != null)
toast.cancel();
}
public void run ()
{
String sText =(((lcv++ % 2) == 0) ? "Help me!" : "I've fallen down!" );
toast.setText(sText);
toast.show();
if (rt != null)
rt.play();
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -51,6 +51,7 @@ JAVAFILES = \
DataWorkerThread.java \
DoAlert.java \
DoCommand.java \
NtpMessage.java \
Power.java \
RedirOutputThread.java \
RunCmdThread.java \

Просмотреть файл

@ -0,0 +1,468 @@
/* ***** BEGIN LICENSE BLOCK *****
* This class represents a NTP message, as specified in RFC 2030. The message
* format is compatible with all versions of NTP and SNTP.
*
* This class does not support the optional authentication protocol, and
* ignores the key ID and message digest fields.
*
* For convenience, this class exposes message values as native Java types, not
* the NTP-specified data formats. For example, timestamps are
* stored as doubles (as opposed to the NTP unsigned 64-bit fixed point
* format).
*
* However, the contructor NtpMessage(byte[]) and the method toByteArray()
* allow the import and export of the raw NTP message format.
*
*
* Usage example
*
* // Send message
* DatagramSocket socket = new DatagramSocket();
* InetAddress address = InetAddress.getByName("ntp.cais.rnp.br");
* byte[] buf = new NtpMessage().toByteArray();
* DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 123);
* socket.send(packet);
*
* // Get response
* socket.receive(packet);
* System.out.println(msg.toString());
*
*
* This code is copyright (c) Adam Buckley 2004
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version. A HTML version of the GNU General Public License can be
* seen at http://www.gnu.org/licenses/gpl.html
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*
* Comments for member variables are taken from RFC2030 by David Mills,
* University of Delaware.
*
* Number format conversion code in NtpMessage(byte[] array) and toByteArray()
* inspired by http://www.pps.jussieu.fr/~jch/enseignement/reseaux/
* NTPMessage.java which is copyright (c) 2003 by Juliusz Chroboczek
*
* @author Adam Buckley
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class NtpMessage
{
/**
* This is a two-bit code warning of an impending leap second to be
* inserted/deleted in the last minute of the current day. It's values
* may be as follows:
*
* Value Meaning
* ----- -------
* 0 no warning
* 1 last minute has 61 seconds
* 2 last minute has 59 seconds)
* 3 alarm condition (clock not synchronized)
*/
public byte leapIndicator = 0;
/**
* This value indicates the NTP/SNTP version number. The version number
* is 3 for Version 3 (IPv4 only) and 4 for Version 4 (IPv4, IPv6 and OSI).
* If necessary to distinguish between IPv4, IPv6 and OSI, the
* encapsulating context must be inspected.
*/
public byte version = 3;
/**
* This value indicates the mode, with values defined as follows:
*
* Mode Meaning
* ---- -------
* 0 reserved
* 1 symmetric active
* 2 symmetric passive
* 3 client
* 4 server
* 5 broadcast
* 6 reserved for NTP control message
* 7 reserved for private use
*
* In unicast and anycast modes, the client sets this field to 3 (client)
* in the request and the server sets it to 4 (server) in the reply. In
* multicast mode, the server sets this field to 5 (broadcast).
*/
public byte mode = 0;
/**
* This value indicates the stratum level of the local clock, with values
* defined as follows:
*
* Stratum Meaning
* ----------------------------------------------
* 0 unspecified or unavailable
* 1 primary reference (e.g., radio clock)
* 2-15 secondary reference (via NTP or SNTP)
* 16-255 reserved
*/
public short stratum = 0;
/**
* This value indicates the maximum interval between successive messages,
* in seconds to the nearest power of two. The values that can appear in
* this field presently range from 4 (16 s) to 14 (16284 s); however, most
* applications use only the sub-range 6 (64 s) to 10 (1024 s).
*/
public byte pollInterval = 0;
/**
* This value indicates the precision of the local clock, in seconds to
* the nearest power of two. The values that normally appear in this field
* range from -6 for mains-frequency clocks to -20 for microsecond clocks
* found in some workstations.
*/
public byte precision = 0;
/**
* This value indicates the total roundtrip delay to the primary reference
* source, in seconds. Note that this variable can take on both positive
* and negative values, depending on the relative time and frequency
* offsets. The values that normally appear in this field range from
* negative values of a few milliseconds to positive values of several
* hundred milliseconds.
*/
public double rootDelay = 0;
/**
* This value indicates the nominal error relative to the primary reference
* source, in seconds. The values that normally appear in this field
* range from 0 to several hundred milliseconds.
*/
public double rootDispersion = 0;
/**
* This is a 4-byte array identifying the particular reference source.
* In the case of NTP Version 3 or Version 4 stratum-0 (unspecified) or
* stratum-1 (primary) servers, this is a four-character ASCII string, left
* justified and zero padded to 32 bits. In NTP Version 3 secondary
* servers, this is the 32-bit IPv4 address of the reference source. In NTP
* Version 4 secondary servers, this is the low order 32 bits of the latest
* transmit timestamp of the reference source. NTP primary (stratum 1)
* servers should set this field to a code identifying the external
* reference source according to the following list. If the external
* reference is one of those listed, the associated code should be used.
* Codes for sources not listed can be contrived as appropriate.
*
* Code External Reference Source
* ---- -------------------------
* LOCL uncalibrated local clock used as a primary reference for
* a subnet without external means of synchronization
* PPS atomic clock or other pulse-per-second source
* individually calibrated to national standards
* ACTS NIST dialup modem service
* USNO USNO modem service
* PTB PTB (Germany) modem service
* TDF Allouis (France) Radio 164 kHz
* DCF Mainflingen (Germany) Radio 77.5 kHz
* MSF Rugby (UK) Radio 60 kHz
* WWV Ft. Collins (US) Radio 2.5, 5, 10, 15, 20 MHz
* WWVB Boulder (US) Radio 60 kHz
* WWVH Kaui Hawaii (US) Radio 2.5, 5, 10, 15 MHz
* CHU Ottawa (Canada) Radio 3330, 7335, 14670 kHz
* LORC LORAN-C radionavigation system
* OMEG OMEGA radionavigation system
* GPS Global Positioning Service
* GOES Geostationary Orbit Environment Satellite
*/
public byte[] referenceIdentifier = {0, 0, 0, 0};
/**
* This is the time at which the local clock was last set or corrected, in
* seconds since 00:00 1-Jan-1900.
*/
public double referenceTimestamp = 0;
/**
* This is the time at which the request departed the client for the
* server, in seconds since 00:00 1-Jan-1900.
*/
public double originateTimestamp = 0;
/**
* This is the time at which the request arrived at the server, in seconds
* since 00:00 1-Jan-1900.
*/
public double receiveTimestamp = 0;
/**
* This is the time at which the reply departed the server for the client,
* in seconds since 00:00 1-Jan-1900.
*/
public double transmitTimestamp = 0;
/**
* Constructs a new NtpMessage from an array of bytes.
*/
public NtpMessage(byte[] array)
{
// See the packet format diagram in RFC 2030 for details
leapIndicator = (byte) ((array[0] >> 6) & 0x3);
version = (byte) ((array[0] >> 3) & 0x7);
mode = (byte) (array[0] & 0x7);
stratum = unsignedByteToShort(array[1]);
pollInterval = array[2];
precision = array[3];
rootDelay = (array[4] * 256.0) +
unsignedByteToShort(array[5]) +
(unsignedByteToShort(array[6]) / 256.0) +
(unsignedByteToShort(array[7]) / 65536.0);
rootDispersion = (unsignedByteToShort(array[8]) * 256.0) +
unsignedByteToShort(array[9]) +
(unsignedByteToShort(array[10]) / 256.0) +
(unsignedByteToShort(array[11]) / 65536.0);
referenceIdentifier[0] = array[12];
referenceIdentifier[1] = array[13];
referenceIdentifier[2] = array[14];
referenceIdentifier[3] = array[15];
referenceTimestamp = decodeTimestamp(array, 16);
originateTimestamp = decodeTimestamp(array, 24);
receiveTimestamp = decodeTimestamp(array, 32);
transmitTimestamp = decodeTimestamp(array, 40);
}
/**
* Constructs a new NtpMessage in client -> server mode, and sets the
* transmit timestamp to the current time.
*/
public NtpMessage()
{
// Note that all the other member variables are already set with
// appropriate default values.
this.mode = 3;
this.transmitTimestamp = (System.currentTimeMillis()/1000.0) + 2208988800.0;
}
/**
* This method constructs the data bytes of a raw NTP packet.
*/
public byte[] toByteArray()
{
// All bytes are automatically set to 0
byte[] p = new byte[48];
p[0] = (byte) (leapIndicator << 6 | version << 3 | mode);
p[1] = (byte) stratum;
p[2] = (byte) pollInterval;
p[3] = (byte) precision;
// root delay is a signed 16.16-bit FP, in Java an int is 32-bits
int l = (int) (rootDelay * 65536.0);
p[4] = (byte) ((l >> 24) & 0xFF);
p[5] = (byte) ((l >> 16) & 0xFF);
p[6] = (byte) ((l >> 8) & 0xFF);
p[7] = (byte) (l & 0xFF);
// root dispersion is an unsigned 16.16-bit FP, in Java there are no
// unsigned primitive types, so we use a long which is 64-bits
long ul = (long) (rootDispersion * 65536.0);
p[8] = (byte) ((ul >> 24) & 0xFF);
p[9] = (byte) ((ul >> 16) & 0xFF);
p[10] = (byte) ((ul >> 8) & 0xFF);
p[11] = (byte) (ul & 0xFF);
p[12] = referenceIdentifier[0];
p[13] = referenceIdentifier[1];
p[14] = referenceIdentifier[2];
p[15] = referenceIdentifier[3];
encodeTimestamp(p, 16, referenceTimestamp);
encodeTimestamp(p, 24, originateTimestamp);
encodeTimestamp(p, 32, receiveTimestamp);
encodeTimestamp(p, 40, transmitTimestamp);
return p;
}
/**
* Returns a string representation of a NtpMessage
*/
public String toString()
{
String precisionStr =
new DecimalFormat("0.#E0").format(Math.pow(2, precision));
return "Leap indicator: " + leapIndicator + "\n" +
"Version: " + version + "\n" +
"Mode: " + mode + "\n" +
"Stratum: " + stratum + "\n" +
"Poll: " + pollInterval + "\n" +
"Precision: " + precision + " (" + precisionStr + " seconds)\n" +
"Root delay: " + new DecimalFormat("0.00").format(rootDelay*1000) + " ms\n" +
"Root dispersion: " + new DecimalFormat("0.00").format(rootDispersion*1000) + " ms\n" +
"Reference identifier: " + referenceIdentifierToString(referenceIdentifier, stratum, version) + "\n" +
"Reference timestamp: " + timestampToString(referenceTimestamp) + "\n" +
"Originate timestamp: " + timestampToString(originateTimestamp) + "\n" +
"Receive timestamp: " + timestampToString(receiveTimestamp) + "\n" +
"Transmit timestamp: " + timestampToString(transmitTimestamp);
}
/**
* Converts an unsigned byte to a short. By default, Java assumes that
* a byte is signed.
*/
public static short unsignedByteToShort(byte b)
{
if((b & 0x80)==0x80) return (short) (128 + (b & 0x7f));
else return (short) b;
}
/**
* Will read 8 bytes of a message beginning at <code>pointer</code>
* and return it as a double, according to the NTP 64-bit timestamp
* format.
*/
public static double decodeTimestamp(byte[] array, int pointer)
{
double r = 0.0;
for(int i=0; i<8; i++)
{
r += unsignedByteToShort(array[pointer+i]) * Math.pow(2, (3-i)*8);
}
return r;
}
/**
* Encodes a timestamp in the specified position in the message
*/
public static void encodeTimestamp(byte[] array, int pointer, double timestamp)
{
// Converts a double into a 64-bit fixed point
for(int i=0; i<8; i++)
{
// 2^24, 2^16, 2^8, .. 2^-32
double base = Math.pow(2, (3-i)*8);
// Capture byte value
array[pointer+i] = (byte) (timestamp / base);
// Subtract captured value from remaining total
timestamp = timestamp - (double) (unsignedByteToShort(array[pointer+i]) * base);
}
// From RFC 2030: It is advisable to fill the non-significant
// low order bits of the timestamp with a random, unbiased
// bitstring, both to avoid systematic roundoff errors and as
// a means of loop detection and replay detection.
array[7] = (byte) (Math.random()*255.0);
}
/**
* Returns a timestamp (number of seconds since 00:00 1-Jan-1900) as a
* formatted date/time string.
*/
public static String timestampToString(double timestamp)
{
if(timestamp==0) return "0";
// timestamp is relative to 1900, utc is used by Java and is relative
// to 1970
double utc = timestamp - (2208988800.0);
// milliseconds
long ms = (long) (utc * 1000.0);
// date/time
String date = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss").format(new Date(ms));
// fraction
double fraction = timestamp - ((long) timestamp);
String fractionSting = new DecimalFormat(".000000").format(fraction);
return date + fractionSting;
}
/**
* Returns a string representation of a reference identifier according
* to the rules set out in RFC 2030.
*/
public static String referenceIdentifierToString(byte[] ref, short stratum, byte version)
{
// From the RFC 2030:
// In the case of NTP Version 3 or Version 4 stratum-0 (unspecified)
// or stratum-1 (primary) servers, this is a four-character ASCII
// string, left justified and zero padded to 32 bits.
if(stratum==0 || stratum==1)
{
return new String(ref);
}
// In NTP Version 3 secondary servers, this is the 32-bit IPv4
// address of the reference source.
else if(version==3)
{
return unsignedByteToShort(ref[0]) + "." +
unsignedByteToShort(ref[1]) + "." +
unsignedByteToShort(ref[2]) + "." +
unsignedByteToShort(ref[3]);
}
// In NTP Version 4 secondary servers, this is the low order 32 bits
// of the latest transmit timestamp of the reference source.
else if(version==4)
{
return "" + ((unsignedByteToShort(ref[0]) / 256.0) +
(unsignedByteToShort(ref[1]) / 65536.0) +
(unsignedByteToShort(ref[2]) / 16777216.0) +
(unsignedByteToShort(ref[3]) / 4294967296.0));
}
return "";
}
}

Просмотреть файл

@ -1,102 +1,102 @@
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os;
import java.io.IOException;
/**
* Class that provides access to some of the power management functions.
*
* {@hide}
*/
public class Power
{
// can't instantiate this class
private Power()
{
}
/**
* Wake lock that ensures that the CPU is running. The screen might
* not be on.
*/
public static final int PARTIAL_WAKE_LOCK = 1;
/**
* Wake lock that ensures that the screen is on.
*/
public static final int FULL_WAKE_LOCK = 2;
public static native void acquireWakeLock(int lock, String id);
public static native void releaseWakeLock(String id);
/**
* Brightness value for fully off
*/
public static final int BRIGHTNESS_OFF = 0;
/**
* Brightness value for dim backlight
*/
public static final int BRIGHTNESS_DIM = 20;
/**
* Brightness value for fully on
*/
public static final int BRIGHTNESS_ON = 255;
/**
* Brightness value to use when battery is low
*/
public static final int BRIGHTNESS_LOW_BATTERY = 10;
/**
* Threshold for BRIGHTNESS_LOW_BATTERY (percentage)
* Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD
*/
public static final int LOW_BATTERY_THRESHOLD = 10;
/**
* Turn the screen on or off
*
* @param on Whether you want the screen on or off
*/
public static native int setScreenState(boolean on);
public static native int setLastUserActivityTimeout(long ms);
/**
* Turn the device off.
*
* This method is considered deprecated in favor of
* {@link android.policy.ShutdownThread.shutdownAfterDisablingRadio()}.
*
* @deprecated
* @hide
*/
@Deprecated
public static native void shutdown();
/**
* Reboot the device.
* @param reason code to pass to the kernel (e.g. "recovery"), or null.
*
* @throws IOException if reboot fails for some reason (eg, lack of
* permission)
*/
public static native void reboot(String reason) throws IOException;
}
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os;
import java.io.IOException;
/**
* Class that provides access to some of the power management functions.
*
* {@hide}
*/
public class Power
{
// can't instantiate this class
private Power()
{
}
/**
* Wake lock that ensures that the CPU is running. The screen might
* not be on.
*/
public static final int PARTIAL_WAKE_LOCK = 1;
/**
* Wake lock that ensures that the screen is on.
*/
public static final int FULL_WAKE_LOCK = 2;
public static native void acquireWakeLock(int lock, String id);
public static native void releaseWakeLock(String id);
/**
* Brightness value for fully off
*/
public static final int BRIGHTNESS_OFF = 0;
/**
* Brightness value for dim backlight
*/
public static final int BRIGHTNESS_DIM = 20;
/**
* Brightness value for fully on
*/
public static final int BRIGHTNESS_ON = 255;
/**
* Brightness value to use when battery is low
*/
public static final int BRIGHTNESS_LOW_BATTERY = 10;
/**
* Threshold for BRIGHTNESS_LOW_BATTERY (percentage)
* Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD
*/
public static final int LOW_BATTERY_THRESHOLD = 10;
/**
* Turn the screen on or off
*
* @param on Whether you want the screen on or off
*/
public static native int setScreenState(boolean on);
public static native int setLastUserActivityTimeout(long ms);
/**
* Turn the device off.
*
* This method is considered deprecated in favor of
* {@link android.policy.ShutdownThread.shutdownAfterDisablingRadio()}.
*
* @deprecated
* @hide
*/
@Deprecated
public static native void shutdown();
/**
* Reboot the device.
* @param reason code to pass to the kernel (e.g. "recovery"), or null.
*
* @throws IOException if reboot fails for some reason (eg, lack of
* permission)
*/
public static native void reboot(String reason) throws IOException;
}

Просмотреть файл

@ -1,32 +1,33 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.mozilla.SUTAgentAndroid;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ateamlogo=0x7f020000;
public static final int ic_stat_first=0x7f020001;
public static final int ic_stat_neterror=0x7f020002;
public static final int ic_stat_second=0x7f020003;
public static final int ic_stat_warning=0x7f020004;
public static final int icon=0x7f020005;
}
public static final class id {
public static final int Button01=0x7f050001;
public static final int Textview01=0x7f050000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.mozilla.SUTAgentAndroid;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ateamlogo=0x7f020000;
public static final int ic_stat_first=0x7f020001;
public static final int ic_stat_neterror=0x7f020002;
public static final int ic_stat_second=0x7f020003;
public static final int ic_stat_warning=0x7f020004;
public static final int icon=0x7f020005;
}
public static final class id {
public static final int Button01=0x7f050001;
public static final int Textview01=0x7f050000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int foreground_service_started=0x7f040002;
public static final int hello=0x7f040000;
}
}

Просмотреть файл

@ -1,164 +1,163 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
public class RedirOutputThread extends Thread
{
OutputStream out;
InputStream sutErr;
InputStream sutOut;
Process pProc;
String strOutput;
public RedirOutputThread(Process pProc, OutputStream out)
{
if (pProc != null)
{
this.pProc = pProc;
sutErr = pProc.getErrorStream(); // Stderr
sutOut = pProc.getInputStream(); // Stdout
}
if (out != null)
this.out = out;
strOutput = "";
}
public void run()
{
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
PrintWriter pOut = null;
byte[] buffer = new byte[1024];
if (out != null)
pOut = new PrintWriter(out);
else
bStillRunning = true;
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
// Toast.makeText(SUTAgentAndroid.me.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
pProc.destroy();
buffer = null;
System.gc();
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
return(bRet);
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
public class RedirOutputThread extends Thread
{
OutputStream out;
InputStream sutErr;
InputStream sutOut;
Process pProc;
String strOutput;
int nExitCode = -1;
public RedirOutputThread(Process pProc, OutputStream out)
{
if (pProc != null)
{
this.pProc = pProc;
sutErr = pProc.getErrorStream(); // Stderr
sutOut = pProc.getInputStream(); // Stdout
}
if (out != null)
this.out = out;
strOutput = "";
}
public void run()
{
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
PrintWriter pOut = null;
byte[] buffer = new byte[1024];
if (out != null)
pOut = new PrintWriter(out);
else
bStillRunning = true;
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
e.printStackTrace();
}
}
pProc.destroy();
buffer = null;
System.gc();
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
nExitCode = -1;
bRet = true;
}
return(bRet);
}
}

Просмотреть файл

@ -1,318 +1,318 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import com.mozilla.SUTAgentAndroid.R;
import com.mozilla.SUTAgentAndroid.SUTAgentAndroid;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
public class RunCmdThread extends Thread
{
private ServerSocket SvrSocket = null;
private Socket socket = null;
private Handler handler = null;
boolean bListening = true;
boolean bNetError = false;
List<CmdWorkerThread> theWorkers = new ArrayList<CmdWorkerThread>();
android.app.Service svc = null;
public RunCmdThread(ServerSocket socket, android.app.Service service, Handler handler)
{
super("RunCmdThread");
this.SvrSocket = socket;
this.svc = service;
this.handler = handler;
}
public void StopListening()
{
bListening = false;
}
public void run() {
try {
int nIterations = 0;
SvrSocket.setSoTimeout(5000);
while (bListening)
{
try
{
socket = SvrSocket.accept();
CmdWorkerThread theWorker = new CmdWorkerThread(this, socket);
theWorker.start();
theWorkers.add(theWorker);
}
catch (SocketTimeoutException toe)
{
if (++nIterations > 60)
{
nIterations = 0;
String sRet = SendPing("www.mozilla.org");
if (sRet.contains("3 received"))
handler.post(new doCancelNotification());
else
handler.post(new doSendNotification("SUTAgent - Network Connectivity Error", sRet));
sRet = null;
}
continue;
}
catch (IOException e)
{
e.printStackTrace();
continue;
}
}
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).StopListening();
while(theWorkers.get(lcv).isAlive())
;
}
}
theWorkers.clear();
SvrSocket.close();
svc.stopSelf();
// SUTAgentAndroid.me.finish();
}
catch (IOException e)
{
e.printStackTrace();
}
return;
}
private String SendPing(String sIPAddr)
{
Process pProc;
String sRet = "";
String [] theArgs = new String [4];
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
byte[] buffer = new byte[1024];
theArgs[0] = "ping";
theArgs[1] = "-c";
theArgs[2] = "3";
theArgs[3] = sIPAddr;
try
{
pProc = Runtime.getRuntime().exec(theArgs);
InputStream sutOut = pProc.getInputStream();
InputStream sutErr = pProc.getErrorStream();
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
e.printStackTrace();
}
if ((bStillRunning == true) && (nBytesErr == 0) && (nBytesOut == 0))
{
try {
sleep(2000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
pProc.destroy();
pProc = null;
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
return (sRet);
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
catch (Exception e)
{
e.printStackTrace();
}
return(bRet);
}
private void SendNotification(String tickerText, String expandedText)
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
// int icon = android.R.drawable.stat_notify_more;
// int icon = R.drawable.ic_stat_first;
// int icon = R.drawable.ic_stat_second;
// int icon = R.drawable.ic_stat_neterror;
int icon = R.drawable.ateamlogo;
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= (Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
Context context = svc.getApplicationContext();
// Intent to launch an activity when the extended text is clicked
Intent intent2 = new Intent(svc, SUTAgentAndroid.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent2, 0);
notification.setLatestEventInfo(context, tickerText, expandedText, launchIntent);
notificationManager.notify(1959, notification);
}
private void CancelNotification()
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1959);
}
class doCancelNotification implements Runnable
{
public void run()
{
CancelNotification();
}
};
class doSendNotification implements Runnable
{
private String sTitle = "";
private String sBText = "";
doSendNotification(String sTitle, String sBodyText)
{
this.sTitle = sTitle;
this.sBText = sBodyText;
}
public void run()
{
SendNotification(sTitle, sBText);
}
};
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import com.mozilla.SUTAgentAndroid.R;
import com.mozilla.SUTAgentAndroid.SUTAgentAndroid;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
public class RunCmdThread extends Thread
{
private ServerSocket SvrSocket = null;
private Socket socket = null;
private Handler handler = null;
boolean bListening = true;
boolean bNetError = false;
List<CmdWorkerThread> theWorkers = new ArrayList<CmdWorkerThread>();
android.app.Service svc = null;
public RunCmdThread(ServerSocket socket, android.app.Service service, Handler handler)
{
super("RunCmdThread");
this.SvrSocket = socket;
this.svc = service;
this.handler = handler;
}
public void StopListening()
{
bListening = false;
}
public void run() {
try {
int nIterations = 0;
SvrSocket.setSoTimeout(5000);
while (bListening)
{
try
{
socket = SvrSocket.accept();
CmdWorkerThread theWorker = new CmdWorkerThread(this, socket);
theWorker.start();
theWorkers.add(theWorker);
}
catch (SocketTimeoutException toe)
{
if (++nIterations > 60)
{
nIterations = 0;
String sRet = SendPing("www.mozilla.org");
if (sRet.contains("3 received"))
handler.post(new doCancelNotification());
else
handler.post(new doSendNotification("SUTAgent - Network Connectivity Error", sRet));
sRet = null;
}
continue;
}
catch (IOException e)
{
e.printStackTrace();
continue;
}
}
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).StopListening();
while(theWorkers.get(lcv).isAlive())
;
}
}
theWorkers.clear();
SvrSocket.close();
svc.stopSelf();
// SUTAgentAndroid.me.finish();
}
catch (IOException e)
{
e.printStackTrace();
}
return;
}
private String SendPing(String sIPAddr)
{
Process pProc;
String sRet = "";
String [] theArgs = new String [4];
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
byte[] buffer = new byte[1024];
theArgs[0] = "ping";
theArgs[1] = "-c";
theArgs[2] = "3";
theArgs[3] = sIPAddr;
try
{
pProc = Runtime.getRuntime().exec(theArgs);
InputStream sutOut = pProc.getInputStream();
InputStream sutErr = pProc.getErrorStream();
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
e.printStackTrace();
}
if ((bStillRunning == true) && (nBytesErr == 0) && (nBytesOut == 0))
{
try {
sleep(2000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
pProc.destroy();
pProc = null;
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
return (sRet);
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
catch (Exception e)
{
e.printStackTrace();
}
return(bRet);
}
private void SendNotification(String tickerText, String expandedText)
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
// int icon = android.R.drawable.stat_notify_more;
// int icon = R.drawable.ic_stat_first;
// int icon = R.drawable.ic_stat_second;
// int icon = R.drawable.ic_stat_neterror;
int icon = R.drawable.ateamlogo;
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= (Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
Context context = svc.getApplicationContext();
// Intent to launch an activity when the extended text is clicked
Intent intent2 = new Intent(svc, SUTAgentAndroid.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent2, 0);
notification.setLatestEventInfo(context, tickerText, expandedText, launchIntent);
notificationManager.notify(1959, notification);
}
private void CancelNotification()
{
NotificationManager notificationManager = (NotificationManager)svc.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1959);
}
class doCancelNotification implements Runnable
{
public void run()
{
CancelNotification();
}
};
class doSendNotification implements Runnable
{
private String sTitle = "";
private String sBText = "";
doSendNotification(String sTitle, String sBodyText)
{
this.sTitle = sTitle;
this.sBText = sBodyText;
}
public void run()
{
SendNotification(sTitle, sBText);
}
};
}

Просмотреть файл

@ -1,125 +1,125 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
public class RunDataThread extends Thread
{
Timer heartBeatTimer;
private ServerSocket SvrSocket = null;
private Socket socket = null;
boolean bListening = true;
List<DataWorkerThread> theWorkers = new ArrayList<DataWorkerThread>();
android.app.Service svc = null;
public RunDataThread(ServerSocket socket, android.app.Service service)
{
super("RunDataThread");
this.SvrSocket = socket;
this.svc = service;
}
public void StopListening()
{
bListening = false;
}
public void SendToDataChannel(String strToSend)
{
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).SendString(strToSend);
}
}
return;
}
public void run() {
try {
SvrSocket.setSoTimeout(5000);
while (bListening)
{
try
{
socket = SvrSocket.accept();
DataWorkerThread theWorker = new DataWorkerThread(this, socket);
theWorker.start();
theWorkers.add(theWorker);
}
catch (SocketTimeoutException toe)
{
continue;
}
}
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).StopListening();
while(theWorkers.get(lcv).isAlive())
;
}
}
theWorkers.clear();
SvrSocket.close();
svc.stopSelf();
}
catch (IOException e)
{
// Toast.makeText(SUTAgentAndroid.me.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
return;
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid.service;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
public class RunDataThread extends Thread
{
Timer heartBeatTimer;
private ServerSocket SvrSocket = null;
private Socket socket = null;
boolean bListening = true;
List<DataWorkerThread> theWorkers = new ArrayList<DataWorkerThread>();
android.app.Service svc = null;
public RunDataThread(ServerSocket socket, android.app.Service service)
{
super("RunDataThread");
this.SvrSocket = socket;
this.svc = service;
}
public void StopListening()
{
bListening = false;
}
public void SendToDataChannel(String strToSend)
{
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).SendString(strToSend);
}
}
return;
}
public void run() {
try {
SvrSocket.setSoTimeout(5000);
while (bListening)
{
try
{
socket = SvrSocket.accept();
DataWorkerThread theWorker = new DataWorkerThread(this, socket);
theWorker.start();
theWorkers.add(theWorker);
}
catch (SocketTimeoutException toe)
{
continue;
}
}
int nNumWorkers = theWorkers.size();
for (int lcv = 0; lcv < nNumWorkers; lcv++)
{
if (theWorkers.get(lcv).isAlive())
{
theWorkers.get(lcv).StopListening();
while(theWorkers.get(lcv).isAlive())
;
}
}
theWorkers.clear();
SvrSocket.close();
svc.stopSelf();
}
catch (IOException e)
{
// Toast.makeText(SUTAgentAndroid.me.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
return;
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,53 +1,53 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SUTStartupIntentReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent mySUTAgentIntent = new Intent(context, SUTAgentAndroid.class);
mySUTAgentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mySUTAgentIntent);
}
}
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.SUTAgentAndroid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SUTStartupIntentReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent mySUTAgentIntent = new Intent(context, SUTAgentAndroid.class);
mySUTAgentIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mySUTAgentIntent);
}
}

Просмотреть файл

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mozilla.fencp"
android:versionCode="1"
android:versionName="1.0" android:sharedUserId="org.mozilla.fennec.sharedID">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:label="@string/app_name" android:name="FenCP">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name="FenCPFP"
android:enabled="true"
android:authorities="org.mozilla.fencp"
android:exported="true">
</provider>
</application>
<uses-sdk android:minSdkVersion="6" />
</manifest>

Просмотреть файл

@ -0,0 +1,211 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.fencp;
import java.io.File;
import java.io.IOException;
import android.database.MatrixCursor;
public class DirCursor extends MatrixCursor {
public static final String _ID = "_id";
public static final String ISDIR = "isdir";
public static final String FILENAME = "filename";
public static final String LENGTH = "length";
public static final String TIMESTAMP = "ts";
public static final String WRITABLE = "writable";
static final String[] DEFCOLUMNS = new String[] {
_ID,
ISDIR,
FILENAME,
LENGTH,
TIMESTAMP,
WRITABLE
};
private String dirPath = null;
private String [] theColumns = null;
public DirCursor(String[] columnNames, String sPath) {
super((columnNames == null ? DEFCOLUMNS : columnNames));
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
dirPath = sPath;
doLoadCursor(dirPath);
}
public DirCursor(String[] columnNames, int initialCapacity, String sPath) {
super((columnNames == null ? DEFCOLUMNS : columnNames), initialCapacity);
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
dirPath = sPath;
doLoadCursor(dirPath);
}
private void doLoadCursor(String sDir) {
File dir = new File(sDir);
int nFiles = 0;
int nCols = theColumns.length;
int lcvFiles = 0;
int nCIndex = 0;
Object [] vals = new Object[nCols];
if (vals == null)
return;
if (dir.isDirectory()) {
try {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 1;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
try {
vals[nCIndex] = dir.getCanonicalPath();
} catch (IOException e) {
vals[nCIndex] = dir.getName();
}
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(WRITABLE);
if (nCIndex > -1)
vals[nCIndex] = (dir.canWrite() ? 1 : 0);
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
File [] files = dir.listFiles();
if (files != null) {
if ((nFiles = files.length) > 0) {
for (lcvFiles = 0; lcvFiles < nFiles; lcvFiles++) {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = lcvFiles;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = (files[lcvFiles].isDirectory() ? 1 : 0);
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = files[lcvFiles].getName();
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = (files[lcvFiles].isDirectory() ? -1 : files[lcvFiles].length());
try {
addRow(vals);
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
}
}
} else {
if (dir.isFile()) {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = dir.getName();
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = dir.length();
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1) {
vals[nCIndex] = dir.lastModified();
}
try {
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
else {
try {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = null;
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1)
vals[nCIndex] = 0;
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
}
}
}

Просмотреть файл

@ -1,47 +1,49 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Firefox.
*
* The Initial Developer of the Original Code is
* the Mozilla Foundation <http://www.mozilla.org>.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
/**
* This interface is not implemented: it exists only for a test of whether
* we load XPTs from JAR files correctly.
*/
[scriptable, uuid(13c9fc33-40e6-44dc-81e2-21e0dd41f232)]
interface xptiITestInterface : nsISupports
{
void testMethod(in unsigned long testArg);
};
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.fencp;
import android.app.Activity;
import android.os.Bundle;
public class FenCP extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Просмотреть файл

@ -0,0 +1,226 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.fencp;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
public class FenCPFP extends ContentProvider {
public static final String PROVIDER_NAME = "org.mozilla.fencp";
public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/file");
public static final String _ID = "_id";
public static final String ISDIR = "isdir";
public static final String FILENAME = "filename";
public static final String LENGTH = "length";
public static final String CHUNK = "chunk";
static String[] dircolumns = new String[] {
_ID,
ISDIR,
FILENAME,
LENGTH
};
static String[] filecolumns = new String[] {
_ID,
CHUNK
};
private static final int DIR = 1;
private static final int FILE_NAME = 2;
private static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "dir", DIR);
uriMatcher.addURI(PROVIDER_NAME, "file", FILE_NAME);
}
public int PruneDir(String sTmpDir) {
int nRet = 0;
int nFiles = 0;
String sSubDir = null;
File dir = new File(sTmpDir);
if (dir.isDirectory()) {
File [] files = dir.listFiles();
if (files != null) {
if ((nFiles = files.length) > 0) {
for (int lcv = 0; lcv < nFiles; lcv++) {
if (files[lcv].isDirectory()) {
sSubDir = files[lcv].getAbsolutePath();
nRet += PruneDir(sSubDir);
}
else {
if (files[lcv].delete()) {
nRet++;
}
}
}
}
}
if (dir.delete()) {
nRet++;
}
if ((nFiles + 1) > nRet) {
nRet = -1;
}
}
return(nRet);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int nFiles = 0;
switch (uriMatcher.match(uri)) {
case FILE_NAME:
File f = new File(selection);
if (f.delete())
nFiles = 1;
break;
case DIR:
nFiles = PruneDir(selection);
break;
default:
break;
}
return nFiles;
}
@Override
public String getType(Uri uri)
{
switch (uriMatcher.match(uri))
{
//---get directory---
case DIR:
return "vnd.android.cursor.dir/vnd.mozilla.dir ";
//---get a particular file---
case FILE_NAME:
return "vnd.android.cursor.item/vnd.mozilla.file ";
//---Unknown---
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor retCursor = null;
switch(uriMatcher.match(uri)) {
case DIR:
retCursor = new DirCursor(projection, selection);
break;
case FILE_NAME:
retCursor = new FileCursor(projection, selection, selectionArgs);
break;
default:
break;
}
return (retCursor);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int nRet = 0;
FileOutputStream dstFile = null;
switch(uriMatcher.match(uri)) {
case DIR:
File dir = new File(selection);
if (dir.mkdirs())
nRet = 1;
break;
case FILE_NAME:
try {
long lOffset = values.getAsLong("offset");
byte [] buf = values.getAsByteArray(CHUNK);
int nLength = values.getAsInteger(LENGTH);
if ((buf != null) && (nLength > 0)) {
File f = new File(selection);
dstFile = new FileOutputStream(f, (lOffset == 0 ? false : true));
dstFile.write(buf,0, nLength);
dstFile.flush();
dstFile.close();
nRet = nLength;
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException ioe) {
try {
dstFile.flush();
} catch (IOException e) {
}
try {
dstFile.close();
} catch (IOException e) {
}
}
break;
default:
break;
}
return nRet;
}
}

Просмотреть файл

@ -0,0 +1,202 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.fencp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.database.AbstractWindowedCursor;
import android.database.CursorWindow;
public class FileCursor extends AbstractWindowedCursor {
public static final String _ID = "_id";
public static final String CHUNK = "chunk";
public static final String LENGTH = "length";
static final String[] DEFCOLUMNS = new String[] {
_ID,
CHUNK,
LENGTH
};
private String filePath = null;
private String [] theColumns = null;
private static final int BUFSIZE = 4096;
private long lFileSize = 0;
private int nCount = 0;
private File theFile = null;
private byte [] theBuffer = null;
private long lOffset = 0;
private long lLength = -1;
public FileCursor(String[] columnNames, String sFilePath, String [] selectionArgs) {
super();
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
filePath = sFilePath;
nCount = -1;
if ((selectionArgs != null) && (selectionArgs.length > 0)) {
lOffset = Long.parseLong(selectionArgs[0]);
lLength = Long.parseLong(selectionArgs[1]);
}
if (filePath.length() > 0) {
theFile = new File(filePath);
if (theFile.exists() && theFile.canRead()) {
lFileSize = theFile.length();
// lLength == -1 return everything between lOffset and eof
// lLength == 0 return file length
// lLength > 0 return lLength bytes
if (lLength == -1) {
lFileSize = lFileSize - lOffset;
} else if (lLength == 0) {
// just return the file length
} else {
lFileSize = ((lLength <= (lFileSize - lOffset)) ? lLength : (lFileSize - lOffset));
}
if (lLength != 0) {
nCount = (int) (lFileSize / BUFSIZE);
if ((lFileSize % BUFSIZE) > 0)
nCount++;
} else {
nCount = 1;
}
mRowIdColumnIndex = 0;
}
}
}
public String getColumnName (int columnIndex) {
return theColumns[columnIndex];
}
@Override
public String[] getColumnNames() {
return theColumns;
}
@Override
public int getCount() {
return nCount;
}
@Override
public boolean onMove(int oldPosition, int newPosition) {
boolean bRet = true;
// get rid of old data
mWindow.clear();
bRet = mWindow.setNumColumns(theColumns.length);
fillWindow(newPosition, mWindow);
return bRet;
}
@Override
public void fillWindow (int pos, CursorWindow window) {
int nNumRows = window.getNumRows();
int nCIndex = 0;
window.setStartPosition(0);
if (pos > -1) {
if (nNumRows == 0) {
window.allocRow();
nNumRows = window.getNumRows();
}
if (nNumRows == 1) {
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1) {
window.putLong(lFileSize, 0, nCIndex);
}
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1) {
window.putLong((long)pos, 0, nCIndex);
}
nCIndex = getColumnIndex(CHUNK);
if (nCIndex > -1) {
if (lLength != 0) {
byte[] value = getABlob (pos, 1);
window.putBlob(value, 0, nCIndex);
}
}
}
window.setStartPosition(pos);
}
return;
}
public byte[] getABlob (int row, int column) {
int nRead = 0;
int nOffset = 0;
int nBufSize = 0;
if ((column == 1) && (theFile != null)) {
try {
FileInputStream fin = new FileInputStream(theFile);
nOffset = row * BUFSIZE;
if (row < (nCount - 1)) {
nBufSize = BUFSIZE;
} else {
nBufSize = (int) (lFileSize - nOffset);
}
theBuffer = new byte[nBufSize];
if (theBuffer != null) {
if (fin.skip(nOffset + lOffset) == (nOffset + lOffset)) {
if ((nRead = fin.read(theBuffer, 0, nBufSize)) != -1) {
if (nRead != nBufSize) {
return null;
}
}
}
}
fin.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return theBuffer;
}
}

Просмотреть файл

@ -1,59 +1,103 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla Firefox.
#
# The Initial Developer of the Original Code is
# the Mozilla Foundation <http://www.mozilla.org>
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = xpcom
XPIDL_MODULE = xpcom_typelib_testxpt
NO_DIST_INSTALL = 1
XPIDLSRCS = xptiITestInterface.idl
XPCSHELL_TESTS = xptunit
include $(topsrcdir)/config/rules.mk
xpcom_typelib_test.jar:: $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt
$(RM) -f $@
cd $(XPIDL_GEN_DIR) && $(ZIP) -q ../$(@F) $(^F)
libs:: xpcom_typelib_test.jar
$(INSTALL) $^ $(FINAL_TARGET)/components
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Android sutagent for testing.
#
# The Initial Developer of the Original Code is
# Mozilla Foundation
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Clint Talbert <ctalbert@mozilla.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = FenCP
JAVAFILES = \
DirCursor.java \
FenCP.java \
FenCPFP.java \
FileCursor.java \
R.java \
$(NULL)
RES_FILES = \
res/drawable-hdpi/icon.png \
res/drawable-ldpi/icon.png \
res/drawable-mdpi/icon.png \
res/layout/main.xml \
res/values/strings.xml \
$(NULL)
GARBAGE += \
AndroidManifest.xml \
classes.dex \
FenCP.apk \
$(NULL)
GARBAGE_DIRS += res classes network-libs
JAVA_CLASSPATH = $(ANDROID_SDK)/android.jar
include $(topsrcdir)/config/rules.mk
# include Android specific java flags - using these instead of what's in rules.mk
include $(topsrcdir)/config/android-common.mk
tools:: FenCP.apk
classes.dex: $(JAVAFILES)
$(NSINSTALL) -D classes
$(JAVAC) $(JAVAC_FLAGS) -d classes $(addprefix $(srcdir)/,$(JAVAFILES))
$(DX) --dex --output=$@ classes
FenCP.ap_: $(srcdir)/AndroidManifest.xml
$(AAPT) package -f -M $(srcdir)/AndroidManifest.xml -I $(ANDROID_SDK)/android.jar -S res -F $@
FenCP-unsigned-unaligned.apk: FenCP.ap_ classes.dex
$(APKBUILDER) $@ -v $(APKBUILDER_FLAGS) -z FenCP.ap_ -f classes.dex
FenCP-unaligned.apk: FenCP-unsigned-unaligned.apk
cp FenCP-unsigned-unaligned.apk $@
ifdef JARSIGNER
$(JARSIGNER) $@
endif
FenCP.apk: FenCP-unaligned.apk
$(ZIPALIGN) -f -v 4 FenCP-unaligned.apk $@
export::
$(NSINSTALL) -D res
@(cd $(srcdir)/res && tar $(TAR_CREATE_FLAGS) - *) | (cd $(DEPTH)/build/mobile/sutagent/android/fencp/res && tar -xf -)

Просмотреть файл

@ -0,0 +1,23 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package org.mozilla.fencp;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}

Просмотреть файл

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-6

Двоичные данные
build/mobile/sutagent/android/fencp/res/drawable-hdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичные данные
build/mobile/sutagent/android/fencp/res/drawable-ldpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.7 KiB

Двоичные данные
build/mobile/sutagent/android/fencp/res/drawable-mdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Просмотреть файл

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

Просмотреть файл

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, FennecCP!</string>
<string name="app_name">FennecCP</string>
</resources>

Просмотреть файл

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mozilla.ffxcp"
android:versionCode="1"
android:versionName="1.0" android:sharedUserId="org.mozilla.firefox.sharedID">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:label="@string/app_name" android:name="ffxcp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name="FfxCPFP"
android:enabled="true"
android:authorities="org.mozilla.ffxcp"
android:exported="true">
</provider>
</application>
<uses-sdk android:minSdkVersion="6" />
</manifest>

Просмотреть файл

@ -0,0 +1,211 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.ffxcp;
import java.io.File;
import java.io.IOException;
import android.database.MatrixCursor;
public class DirCursor extends MatrixCursor {
public static final String _ID = "_id";
public static final String ISDIR = "isdir";
public static final String FILENAME = "filename";
public static final String LENGTH = "length";
public static final String TIMESTAMP = "ts";
public static final String WRITABLE = "writable";
static final String[] DEFCOLUMNS = new String[] {
_ID,
ISDIR,
FILENAME,
LENGTH,
TIMESTAMP,
WRITABLE
};
private String dirPath = null;
private String [] theColumns = null;
public DirCursor(String[] columnNames, String sPath) {
super((columnNames == null ? DEFCOLUMNS : columnNames));
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
dirPath = sPath;
doLoadCursor(dirPath);
}
public DirCursor(String[] columnNames, int initialCapacity, String sPath) {
super((columnNames == null ? DEFCOLUMNS : columnNames), initialCapacity);
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
dirPath = sPath;
doLoadCursor(dirPath);
}
private void doLoadCursor(String sDir) {
File dir = new File(sDir);
int nFiles = 0;
int nCols = theColumns.length;
int lcvFiles = 0;
int nCIndex = 0;
Object [] vals = new Object[nCols];
if (vals == null)
return;
if (dir.isDirectory()) {
try {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 1;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
try {
vals[nCIndex] = dir.getCanonicalPath();
} catch (IOException e) {
vals[nCIndex] = dir.getName();
}
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(WRITABLE);
if (nCIndex > -1)
vals[nCIndex] = (dir.canWrite() ? 1 : 0);
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
File [] files = dir.listFiles();
if (files != null) {
if ((nFiles = files.length) > 0) {
for (lcvFiles = 0; lcvFiles < nFiles; lcvFiles++) {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = lcvFiles;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = (files[lcvFiles].isDirectory() ? 1 : 0);
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = files[lcvFiles].getName();
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = (files[lcvFiles].isDirectory() ? -1 : files[lcvFiles].length());
try {
addRow(vals);
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
}
}
} else {
if (dir.isFile()) {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = dir.getName();
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = dir.length();
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1) {
vals[nCIndex] = dir.lastModified();
}
try {
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
else {
try {
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1)
vals[nCIndex] = -1;
nCIndex = getColumnIndex(ISDIR);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(FILENAME);
if (nCIndex > -1)
vals[nCIndex] = null;
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1)
vals[nCIndex] = 0;
nCIndex = getColumnIndex(TIMESTAMP);
if (nCIndex > -1)
vals[nCIndex] = 0;
addRow(vals);
}
catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
}
}
}
}

Просмотреть файл

@ -0,0 +1,226 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.ffxcp;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
public class FfxCPFP extends ContentProvider {
public static final String PROVIDER_NAME = "org.mozilla.ffxcp";
public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/file");
public static final String _ID = "_id";
public static final String ISDIR = "isdir";
public static final String FILENAME = "filename";
public static final String LENGTH = "length";
public static final String CHUNK = "chunk";
static String[] dircolumns = new String[] {
_ID,
ISDIR,
FILENAME,
LENGTH
};
static String[] filecolumns = new String[] {
_ID,
CHUNK
};
private static final int DIR = 1;
private static final int FILE_NAME = 2;
private static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "dir", DIR);
uriMatcher.addURI(PROVIDER_NAME, "file", FILE_NAME);
}
public int PruneDir(String sTmpDir) {
int nRet = 0;
int nFiles = 0;
String sSubDir = null;
File dir = new File(sTmpDir);
if (dir.isDirectory()) {
File [] files = dir.listFiles();
if (files != null) {
if ((nFiles = files.length) > 0) {
for (int lcv = 0; lcv < nFiles; lcv++) {
if (files[lcv].isDirectory()) {
sSubDir = files[lcv].getAbsolutePath();
nRet += PruneDir(sSubDir);
}
else {
if (files[lcv].delete()) {
nRet++;
}
}
}
}
}
if (dir.delete()) {
nRet++;
}
if ((nFiles + 1) > nRet) {
nRet = -1;
}
}
return(nRet);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int nFiles = 0;
switch (uriMatcher.match(uri)) {
case FILE_NAME:
File f = new File(selection);
if (f.delete())
nFiles = 1;
break;
case DIR:
nFiles = PruneDir(selection);
break;
default:
break;
}
return nFiles;
}
@Override
public String getType(Uri uri)
{
switch (uriMatcher.match(uri))
{
//---get directory---
case DIR:
return "vnd.android.cursor.dir/vnd.mozilla.dir ";
//---get a particular file---
case FILE_NAME:
return "vnd.android.cursor.item/vnd.mozilla.file ";
//---Unknown---
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor retCursor = null;
switch(uriMatcher.match(uri)) {
case DIR:
retCursor = new DirCursor(projection, selection);
break;
case FILE_NAME:
retCursor = new FileCursor(projection, selection, selectionArgs);
break;
default:
break;
}
return (retCursor);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int nRet = 0;
FileOutputStream dstFile = null;
switch(uriMatcher.match(uri)) {
case DIR:
File dir = new File(selection);
if (dir.mkdirs())
nRet = 1;
break;
case FILE_NAME:
try {
long lOffset = values.getAsLong("offset");
byte [] buf = values.getAsByteArray(CHUNK);
int nLength = values.getAsInteger(LENGTH);
if ((buf != null) && (nLength > 0)) {
File f = new File(selection);
dstFile = new FileOutputStream(f, (lOffset == 0 ? false : true));
dstFile.write(buf,0, nLength);
dstFile.flush();
dstFile.close();
nRet = nLength;
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
} catch (IOException ioe) {
try {
dstFile.flush();
} catch (IOException e) {
}
try {
dstFile.close();
} catch (IOException e) {
}
}
break;
default:
break;
}
return nRet;
}
}

Просмотреть файл

@ -0,0 +1,203 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.ffxcp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.database.AbstractWindowedCursor;
import android.database.CursorWindow;
public class FileCursor extends AbstractWindowedCursor {
public static final String _ID = "_id";
public static final String CHUNK = "chunk";
public static final String LENGTH = "length";
static final String[] DEFCOLUMNS = new String[] {
_ID,
CHUNK,
LENGTH
};
private String filePath = null;
private String [] theColumns = null;
private static final int BUFSIZE = 4096;
private long lFileSize = 0;
private int nCount = 0;
private File theFile = null;
private byte [] theBuffer = null;
private long lOffset = 0;
private long lLength = -1;
public FileCursor(String[] columnNames, String sFilePath, String [] selectionArgs) {
super();
theColumns = (columnNames == null ? DEFCOLUMNS : columnNames);
filePath = sFilePath;
nCount = -1;
if ((selectionArgs != null) && (selectionArgs.length > 0)) {
lOffset = Long.parseLong(selectionArgs[0]);
lLength = Long.parseLong(selectionArgs[1]);
}
if (filePath.length() > 0) {
theFile = new File(filePath);
if (theFile.exists() && theFile.canRead()) {
lFileSize = theFile.length();
// lLength == -1 return everything between lOffset and eof
// lLength == 0 return file length
// lLength > 0 return lLength bytes
if (lLength == -1) {
lFileSize = lFileSize - lOffset;
} else if (lLength == 0) {
// just return the file length
} else {
lFileSize = ((lLength <= (lFileSize - lOffset)) ? lLength : (lFileSize - lOffset));
}
if (lLength != 0) {
nCount = (int) (lFileSize / BUFSIZE);
if ((lFileSize % BUFSIZE) > 0)
nCount++;
} else {
nCount = 1;
}
mRowIdColumnIndex = 0;
}
}
}
public String getColumnName (int columnIndex) {
return theColumns[columnIndex];
}
@Override
public String[] getColumnNames() {
return theColumns;
}
@Override
public int getCount() {
return nCount;
}
@Override
public boolean onMove(int oldPosition, int newPosition) {
boolean bRet = true;
// get rid of old data
mWindow.clear();
bRet = mWindow.setNumColumns(theColumns.length);
fillWindow(newPosition, mWindow);
return bRet;
}
@Override
public void fillWindow (int pos, CursorWindow window) {
int nNumRows = window.getNumRows();
int nCIndex = 0;
window.setStartPosition(0);
if (pos > -1) {
if (nNumRows == 0) {
window.allocRow();
nNumRows = window.getNumRows();
}
if (nNumRows == 1) {
nCIndex = getColumnIndex(LENGTH);
if (nCIndex > -1) {
window.putLong(lFileSize, 0, nCIndex);
}
nCIndex = getColumnIndex(_ID);
if (nCIndex > -1) {
window.putLong((long)pos, 0, nCIndex);
}
nCIndex = getColumnIndex(CHUNK);
if (nCIndex > -1) {
if (lLength != 0) {
byte[] value = getABlob (pos, 1);
window.putBlob(value, 0, nCIndex);
}
}
}
window.setStartPosition(pos);
}
return;
}
public byte[] getABlob (int row, int column) {
int nRead = 0;
int nOffset = 0;
int nBufSize = 0;
if ((column == 1) && (theFile != null)) {
try {
FileInputStream fin = new FileInputStream(theFile);
nOffset = row * BUFSIZE;
if (row < (nCount - 1)) {
nBufSize = BUFSIZE;
} else {
nBufSize = (int) (lFileSize - nOffset);
}
theBuffer = new byte[nBufSize];
if (theBuffer != null) {
if (fin.skip(nOffset + lOffset) == (nOffset + lOffset)) {
if ((nRead = fin.read(theBuffer, 0, nBufSize)) != -1) {
if (nRead != nBufSize) {
return null;
}
}
}
}
fin.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return theBuffer;
}
}

Просмотреть файл

@ -0,0 +1,103 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Android sutagent for testing.
#
# The Initial Developer of the Original Code is
# Mozilla Foundation
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Clint Talbert <ctalbert@mozilla.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = FfxCP
JAVAFILES = \
DirCursor.java \
ffxcp.java \
FfxCPFP.java \
FileCursor.java \
R.java \
$(NULL)
RES_FILES = \
res/drawable-hdpi/icon.png \
res/drawable-ldpi/icon.png \
res/drawable-mdpi/icon.png \
res/layout/main.xml \
res/values/strings.xml \
$(NULL)
GARBAGE += \
AndroidManifest.xml \
classes.dex \
FfxCP.apk \
$(NULL)
GARBAGE_DIRS += res classes network-libs
JAVA_CLASSPATH = $(ANDROID_SDK)/android.jar
include $(topsrcdir)/config/rules.mk
# include Android specific java flags - using these instead of what's in rules.mk
include $(topsrcdir)/config/android-common.mk
tools:: FfxCP.apk
classes.dex: $(JAVAFILES)
$(NSINSTALL) -D classes
$(JAVAC) $(JAVAC_FLAGS) -d classes $(addprefix $(srcdir)/,$(JAVAFILES))
$(DX) --dex --output=$@ classes
FfxCP.ap_: $(srcdir)/AndroidManifest.xml
$(AAPT) package -f -M $(srcdir)/AndroidManifest.xml -I $(ANDROID_SDK)/android.jar -S res -F $@
FfxCP-unsigned-unaligned.apk: FfxCP.ap_ classes.dex
$(APKBUILDER) $@ -v $(APKBUILDER_FLAGS) -z FfxCP.ap_ -f classes.dex
FfxCP-unaligned.apk: FfxCP-unsigned-unaligned.apk
cp FfxCP-unsigned-unaligned.apk $@
ifdef JARSIGNER
$(JARSIGNER) $@
endif
FfxCP.apk: FfxCP-unaligned.apk
$(ZIPALIGN) -f -v 4 FfxCP-unaligned.apk $@
export::
$(NSINSTALL) -D res
@(cd $(srcdir)/res && tar $(TAR_CREATE_FLAGS) - *) | (cd $(DEPTH)/build/mobile/sutagent/android/ffxcp/res && tar -xf -)

Просмотреть файл

@ -0,0 +1,23 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package org.mozilla.ffxcp;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}

Просмотреть файл

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-6

Просмотреть файл

@ -1,4 +1,3 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -12,18 +11,19 @@
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
@ -34,13 +34,16 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package org.mozilla.ffxcp;
#ifndef nsUConvDll_h___
#define nsUConvDll_h___
import android.app.Activity;
import android.os.Bundle;
#include "nsISupports.h"
class nsIComponentManager;
class nsIFile;
struct nsModuleComponentInfo;
#endif /* nsUConvDll_h___ */
public class ffxcp extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Двоичные данные
build/mobile/sutagent/android/ffxcp/res/drawable-hdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичные данные
build/mobile/sutagent/android/ffxcp/res/drawable-ldpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.7 KiB

Двоичные данные
build/mobile/sutagent/android/ffxcp/res/drawable-mdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Просмотреть файл

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

Просмотреть файл

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, firefoxcp!</string>
<string name="app_name">FirefoxCP</string>
</resources>

Просмотреть файл

@ -14,4 +14,6 @@
<Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:text="Exit"></Button>
</LinearLayout>

Просмотреть файл

@ -3,4 +3,8 @@
<string name="hello">Hello World, SUTAgentAndroid!</string>
<string name="app_name">SUTAgentAndroid</string>
<string name="foreground_service_started">Foreground Service Started (ASMozStub)</string>
</resources>

Просмотреть файл

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mozilla.watcher"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".WatcherMain"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".WatcherReceiver">
<intent-filter>
<action android:value="android.intent.action.BOOT_COMPLETED" android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:value="android.intent.category.HOME" android:name="android.intent.category.HOME"/>
</intent-filter>
</receiver>
<service android:name="WatcherService">
<intent-filter>
<action android:name="com.mozilla.watcher.LISTENER_SERVICE" />
</intent-filter>
</service>
</application>
<uses-sdk android:minSdkVersion="5" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
</manifest>

Просмотреть файл

@ -0,0 +1,104 @@
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: C:\\Users\\Bob\\workspace\\Watcher\\src\\com\\mozilla\\watcher\\IWatcherService.aidl
*/
package com.mozilla.watcher;
public interface IWatcherService extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.mozilla.watcher.IWatcherService
{
private static final java.lang.String DESCRIPTOR = "com.mozilla.watcher.IWatcherService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.mozilla.watcher.IWatcherService interface,
* generating a proxy if needed.
*/
public static com.mozilla.watcher.IWatcherService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.mozilla.watcher.IWatcherService))) {
return ((com.mozilla.watcher.IWatcherService)iin);
}
return new com.mozilla.watcher.IWatcherService.Stub.Proxy(obj);
}
public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_UpdateApplication:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _arg0;
_arg0 = data.readString();
java.lang.String _arg1;
_arg1 = data.readString();
java.lang.String _arg2;
_arg2 = data.readString();
int _arg3;
_arg3 = data.readInt();
int _result = this.UpdateApplication(_arg0, _arg1, _arg2, _arg3);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.mozilla.watcher.IWatcherService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
public int UpdateApplication(java.lang.String sPkgName, java.lang.String sPkgFileName, java.lang.String sOutFile, int bReboot) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(sPkgName);
_data.writeString(sPkgFileName);
_data.writeString(sOutFile);
_data.writeInt(bReboot);
mRemote.transact(Stub.TRANSACTION_UpdateApplication, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_UpdateApplication = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public int UpdateApplication(java.lang.String sPkgName, java.lang.String sPkgFileName, java.lang.String sOutFile, int bReboot) throws android.os.RemoteException;
}

Просмотреть файл

@ -0,0 +1,107 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Android sutagent for testing.
#
# The Initial Developer of the Original Code is
# Mozilla Foundation
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Clint Talbert <ctalbert@mozilla.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = Watcher
JAVAFILES = \
IWatcherService.java \
RedirOutputThread.java \
R.java \
WatcherMain.java \
WatcherReceiver.java \
WatcherService.java \
$(NULL)
RES_FILES = \
res/drawable-hdpi/icon.png \
res/drawable-hdpi/ateamlogo.png \
res/drawable-ldpi/icon.png \
res/drawable-ldpi/ateamlogo.png \
res/drawable-mdpi/icon.png \
res/drawable-mdpi/ateamlogo.png \
res/layout/main.xml \
res/values/strings.xml \
$(NULL)
GARBAGE += \
AndroidManifest.xml \
classes.dex \
Watcher.apk \
$(NULL)
GARBAGE_DIRS += res classes network-libs
JAVA_CLASSPATH = $(ANDROID_SDK)/android.jar
include $(topsrcdir)/config/rules.mk
# include Android specific java flags - using these instead of what's in rules.mk
include $(topsrcdir)/config/android-common.mk
tools:: Watcher.apk
classes.dex: $(JAVAFILES)
$(NSINSTALL) -D classes
$(JAVAC) $(JAVAC_FLAGS) -d classes $(addprefix $(srcdir)/,$(JAVAFILES))
$(DX) --dex --output=$@ classes
Watcher.ap_: $(srcdir)/AndroidManifest.xml
$(AAPT) package -f -M $(srcdir)/AndroidManifest.xml -I $(ANDROID_SDK)/android.jar -S res -F $@
Watcher-unsigned-unaligned.apk: Watcher.ap_ classes.dex
$(APKBUILDER) $@ -v $(APKBUILDER_FLAGS) -z Watcher.ap_ -f classes.dex
Watcher-unaligned.apk: Watcher-unsigned-unaligned.apk
cp Watcher-unsigned-unaligned.apk $@
ifdef JARSIGNER
$(JARSIGNER) $@
endif
Watcher.apk: Watcher-unaligned.apk
$(ZIPALIGN) -f -v 4 Watcher-unaligned.apk $@
export::
$(NSINSTALL) -D res
@(cd $(srcdir)/res && tar $(TAR_CREATE_FLAGS) - *) | (cd $(DEPTH)/build/mobile/sutagent/android/watcher/res && tar -xf -)

Просмотреть файл

@ -0,0 +1,25 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.mozilla.watcher;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ateamlogo=0x7f020000;
public static final int icon=0x7f020001;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int foreground_service_started=0x7f040002;
public static final int hello=0x7f040000;
}
}

Просмотреть файл

@ -0,0 +1,164 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.watcher;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
public class RedirOutputThread extends Thread
{
OutputStream out;
InputStream sutErr;
InputStream sutOut;
Process pProc;
String strOutput;
public RedirOutputThread(Process pProc, OutputStream out)
{
if (pProc != null)
{
this.pProc = pProc;
sutErr = pProc.getErrorStream(); // Stderr
sutOut = pProc.getInputStream(); // Stdout
}
if (out != null)
this.out = out;
strOutput = "";
}
public void run()
{
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
PrintWriter pOut = null;
byte[] buffer = new byte[1024];
if (out != null)
pOut = new PrintWriter(out);
else
bStillRunning = true;
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
if (pOut != null)
{
pOut.print(sRep);
pOut.flush();
}
else
strOutput += sRep;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
// Toast.makeText(SUTAgentAndroid.me.getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
pProc.destroy();
buffer = null;
System.gc();
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
return(bRet);
}
}

Просмотреть файл

@ -1,4 +1,3 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -12,18 +11,19 @@
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
@ -34,10 +34,16 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.watcher;
#ifndef nsUCvMinDll_h___
#define nsUCvMinDll_h___
import android.app.Activity;
import android.os.Bundle;
#include "prtypes.h"
#endif /* nsUCvMinDll_h___ */
public class WatcherMain extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Просмотреть файл

@ -1,4 +1,3 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -12,17 +11,15 @@
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2002
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Nisheeth Ranjan <nisheeth@netscape.com> (original author)
* Peter Van der Beken <peterv@netscape.com>
*
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@ -37,21 +34,22 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.watcher;
#include "nsISupports.idl"
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
// import android.os.Debug;
interface nsIDOMNode;
interface nsIDOMDocument;
public class WatcherReceiver extends BroadcastReceiver {
/**
* @deprecated Use nsIXSLTProcessor instead!!
*/
@Override
public void onReceive(Context context, Intent intent) {
// Debug.waitForDebugger();
Intent serviceIntent = new Intent();
serviceIntent.putExtra("command", "start");
serviceIntent.setAction("com.mozilla.watcher.LISTENER_SERVICE");
context.startService(serviceIntent);
}
[deprecated, scriptable, uuid(3fbff728-2d20-11d3-aef3-00108300ff91)]
interface nsIXSLTProcessorObsolete : nsISupports
{
void transformDocument(in nsIDOMNode aSourceDOM,
in nsIDOMNode aStyleDOM,
in nsIDOMDocument aOutputDOC,
in nsISupports aObserver);
};
}

Просмотреть файл

@ -0,0 +1,948 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Android SUTAgent code.
*
* The Initial Developer of the Original Code is
* Bob Moss.
* Portions created by the Initial Developer are Copyright (C) 2010
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Moss <bmoss@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
package com.mozilla.watcher;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteException;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;
public class WatcherService extends Service
{
String sErrorPrefix = "##Installer Error## ";
String currentDir = "/";
String sPingTarget = "";
long lDelay = 60000;
long lPeriod = 300000;
int nMaxStrikes = 3;
Process pProc;
Context myContext = null;
Timer myTimer = null;
private PowerManager.WakeLock pwl = null;
public static final int NOTIFICATION_ID = 1964;
boolean bInstalling = false;
@SuppressWarnings("unchecked")
private static final Class[] mStartForegroundSignature = new Class[] {
int.class, Notification.class};
@SuppressWarnings("unchecked")
private static final Class[] mStopForegroundSignature = new Class[] {
boolean.class};
private NotificationManager mNM;
private Method mStartForeground;
private Method mStopForeground;
private Object[] mStartForegroundArgs = new Object[2];
private Object[] mStopForegroundArgs = new Object[1];
private IWatcherService.Stub stub = new IWatcherService.Stub() {
public int UpdateApplication(String sAppName, String sFileName, String sOutFile, int bReboot) throws RemoteException
{
return UpdtApp(sAppName, sFileName, sOutFile, bReboot);
}
};
@Override
public IBinder onBind(Intent arg0) {
return stub;
}
@Override
public void onCreate()
{
super.onCreate();
myContext = this;
getKeyGuardAndWakeLock();
File dir = getFilesDir();
File iniFile = new File(dir, "watcher.ini");
String sIniFile = iniFile.getAbsolutePath();
String sHold = "";
this.sPingTarget = GetIniData("watcher", "PingTarget", sIniFile, "www.mozilla.org");
sHold = GetIniData("watcher", "delay", sIniFile, "60000");
this.lDelay = Long.parseLong(sHold.trim());
sHold = GetIniData("watcher", "period", sIniFile,"300000");
this.lPeriod = Long.parseLong(sHold.trim());
sHold = GetIniData("watcher", "strikes", sIniFile,"3");
this.nMaxStrikes = Integer.parseInt(sHold.trim());
doToast("WatcherService created");
}
public String GetIniData(String sSection, String sKey, String sFile, String sDefault)
{
String sRet = sDefault;
String sComp = "";
String sLine = "";
boolean bFound = false;
BufferedReader in = null;
String sTmpFileName = fixFileName(sFile);
try {
in = new BufferedReader(new FileReader(sTmpFileName));
sComp = "[" + sSection + "]";
while ((sLine = in.readLine()) != null)
{
if (sLine.equalsIgnoreCase(sComp))
{
bFound = true;
break;
}
}
if (bFound)
{
sComp = (sKey + " =").toLowerCase();
while ((sLine = in.readLine()) != null)
{
if (sLine.toLowerCase().contains(sComp))
{
String [] temp = null;
temp = sLine.split("=");
if (temp != null)
{
if (temp.length > 1)
sRet = temp[1].trim();
}
break;
}
}
}
in.close();
}
catch (FileNotFoundException e)
{
sComp = e.toString();
}
catch (IOException e)
{
sComp = e.toString();
}
return (sRet);
}
private void handleCommand(Intent intent)
{
String sCmd = intent.getStringExtra("command");
// Debug.waitForDebugger();
if (sCmd != null)
{
if (sCmd.equalsIgnoreCase("updt"))
{
String sPkgName = intent.getStringExtra("pkgName");
String sPkgFile = intent.getStringExtra("pkgFile");
String sOutFile = intent.getStringExtra("outFile");
boolean bReboot = intent.getBooleanExtra("reboot", true);
int nReboot = bReboot ? 1 : 0;
SendNotification("WatcherService updating " + sPkgName + " using file " + sPkgFile, "WatcherService updating " + sPkgName + " using file " + sPkgFile);
UpdateApplication worker = new UpdateApplication(sPkgName, sPkgFile, sOutFile, nReboot);
}
else if (sCmd.equalsIgnoreCase("start"))
{
doToast("WatcherService started");
myTimer = new Timer();
myTimer.scheduleAtFixedRate(new MyTime(), lDelay, lPeriod);
}
else
{
doToast("WatcherService unknown command");
}
}
else
doToast("WatcherService created");
}
@Override
public void onStart(Intent intent, int startId) {
handleCommand(intent);
return;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handleCommand(intent);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
doToast("WatcherService destroyed");
if (pwl != null)
pwl.release();
stopForegroundCompat(R.string.foreground_service_started);
}
protected void getKeyGuardAndWakeLock()
{
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
// Keep phone from locking or remove lock on screen
KeyguardManager km = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
if (km != null)
{
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("watcher");
if (kl != null)
kl.disableKeyguard();
}
// No sleeping on the job
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm != null)
{
pwl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "watcher");
if (pwl != null)
pwl.acquire();
}
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
try {
mStartForeground = getClass().getMethod("startForeground", mStartForegroundSignature);
mStopForeground = getClass().getMethod("stopForeground", mStopForegroundSignature);
}
catch (NoSuchMethodException e)
{
// Running on an older platform.
mStartForeground = mStopForeground = null;
}
Notification notification = new Notification();
startForegroundCompat(R.string.foreground_service_started, notification);
}
};
t.start();
}
/**
* This is a wrapper around the new startForeground method, using the older
* APIs if it is not available.
*/
void startForegroundCompat(int id, Notification notification) {
// If we have the new startForeground API, then use it.
if (mStartForeground != null) {
mStartForegroundArgs[0] = Integer.valueOf(id);
mStartForegroundArgs[1] = notification;
try {
mStartForeground.invoke(this, mStartForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke startForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke startForeground", e);
}
return;
}
// Fall back on the old API.
setForeground(true);
mNM.notify(id, notification);
}
/**
* This is a wrapper around the new stopForeground method, using the older
* APIs if it is not available.
*/
void stopForegroundCompat(int id) {
// If we have the new stopForeground API, then use it.
if (mStopForeground != null) {
mStopForegroundArgs[0] = Boolean.TRUE;
try {
mStopForeground.invoke(this, mStopForegroundArgs);
} catch (InvocationTargetException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke stopForeground", e);
} catch (IllegalAccessException e) {
// Should not happen.
Log.w("ApiDemos", "Unable to invoke stopForeground", e);
}
return;
}
// Fall back on the old API. Note to cancel BEFORE changing the
// foreground state, since we could be killed at that point.
mNM.cancel(id);
setForeground(false);
}
public void doToast(String sMsg)
{
Toast toast = Toast.makeText(this, sMsg, Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 100);
toast.show();
}
public void CheckMem() {
System.gc();
long lFreeMemory = Runtime.getRuntime().freeMemory();
long lTotMemory = Runtime.getRuntime().totalMemory();
long lMaxMemory = Runtime.getRuntime().maxMemory();
SendNotification("Memory Check", "Free: " + lFreeMemory + "Total: " + lTotMemory + "Max: " + lMaxMemory);
}
public int UpdtApp(String sPkgName, String sPkgFileName, String sOutFile, int bReboot)
{
int nRet = 1;
int lcv = 0;
String sRet = "";
// Debug.waitForDebugger();
FileOutputStream f = null;
try {
SendNotification("Killing " + sPkgName, "Step 1: Kill " + sPkgName + " if running");
while (!IsProcessDead(sPkgName) && (lcv < 5)) {
if (KillProcess(sPkgName, null).startsWith("Successfully"))
break;
else
lcv++;
Thread.sleep(2000);
}
CheckMem();
if ((sOutFile != null) && (sOutFile.length() > 0)) {
File outFile = new File(sOutFile);
if (outFile.exists() && outFile.canWrite()) {
f = new FileOutputStream(outFile, true);
} else {
SendNotification("File not found or cannot write to " + sOutFile, "File not found or cannot write to " + sOutFile);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
SendNotification("File not found " + sOutFile, "Couldn't open " + sOutFile + " " + e.getLocalizedMessage());
e.printStackTrace();
} catch (SecurityException e) {
SendNotification("Security excepetion for " + sOutFile, "Exception message " + e.getLocalizedMessage());
e.printStackTrace();
}
if ((sPkgName != null) && (sPkgName.length() > 0))
{
SendNotification("Uninstalling " + sPkgName, "Step 2: Uninstall " + sPkgName);
sRet = UnInstallApp(sPkgName, null);
CheckMem();
if ((sRet.length() > 0) && (f != null))
{
try {
f.write(sRet.getBytes());
f.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
if ((sPkgFileName != null) && (sPkgFileName.length() > 0))
{
SendNotification("Installing " + sPkgFileName, "Step 3: Install " + sPkgFileName);
sRet = InstallApp(sPkgFileName, null);
SendNotification("Installed " + sPkgFileName, "" + sRet);
CheckMem();
if ((sRet.length() > 0) && (f != null))
{
try {
f.write(sRet.getBytes());
f.flush();
f.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
if (bReboot > 0)
RunReboot(null);
return(nRet);
}
public boolean GetProcessInfo(String sProcName)
{
boolean bRet = false;
ActivityManager aMgr = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE);
List <ActivityManager.RunningAppProcessInfo> lProcesses = aMgr.getRunningAppProcesses();
int nProcs = lProcesses.size();
int lcv = 0;
String strProcName = "";
for (lcv = 0; lcv < nProcs; lcv++)
{
strProcName = lProcesses.get(lcv).processName;
if (strProcName.contains(sProcName))
{
bRet = true;
}
}
return (bRet);
}
public String RunReboot(OutputStream out)
{
String sRet = "";
String [] theArgs = new String [3];
theArgs[0] = "su";
theArgs[1] = "-c";
theArgs[2] = "reboot";
try
{
pProc = Runtime.getRuntime().exec(theArgs);
RedirOutputThread outThrd = new RedirOutputThread(pProc, out);
outThrd.start();
outThrd.join(10000);
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return (sRet);
}
public String KillProcess(String sProcName, OutputStream out)
{
String [] theArgs = new String [3];
theArgs[0] = "su";
theArgs[1] = "-c";
theArgs[2] = "kill";
String sRet = sErrorPrefix + "Unable to kill " + sProcName + "\n";
ActivityManager aMgr = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
List <ActivityManager.RunningAppProcessInfo> lProcesses = aMgr.getRunningAppProcesses();
int lcv = 0;
String strProcName = "";
int nPID = 0;
for (lcv = 0; lcv < lProcesses.size(); lcv++)
{
if (lProcesses.get(lcv).processName.contains(sProcName))
{
strProcName = lProcesses.get(lcv).processName;
nPID = lProcesses.get(lcv).pid;
sRet = sErrorPrefix + "Failed to kill " + nPID + " " + strProcName + "\n";
theArgs[2] += " " + nPID;
try
{
pProc = Runtime.getRuntime().exec(theArgs);
RedirOutputThread outThrd = new RedirOutputThread(pProc, out);
outThrd.start();
outThrd.join(5000);
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// Give the messages a chance to be processed
try {
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
break;
}
}
if (nPID > 0)
{
sRet = "Successfully killed " + nPID + " " + strProcName + "\n";
lProcesses = aMgr.getRunningAppProcesses();
for (lcv = 0; lcv < lProcesses.size(); lcv++)
{
if (lProcesses.get(lcv).processName.contains(sProcName))
{
sRet = sErrorPrefix + "Unable to kill " + nPID + " " + strProcName + "\n";
break;
}
}
}
return (sRet);
}
public String GetAppRoot(String AppName)
{
String sRet = sErrorPrefix + " internal error [no context]";
Context ctx = getApplicationContext();
if (ctx != null)
{
try {
Context appCtx = ctx.createPackageContext(AppName, 0);
ContextWrapper appCtxW = new ContextWrapper(appCtx);
sRet = appCtxW.getPackageResourcePath();
appCtxW = null;
appCtx = null;
ctx = null;
System.gc();
}
catch (NameNotFoundException e)
{
e.printStackTrace();
}
}
return(sRet);
}
public boolean IsProcessDead(String sProcName)
{
boolean bRet = true;
ActivityManager aMgr = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
List <ActivityManager.RunningAppProcessInfo> lProcesses = aMgr.getRunningAppProcesses(); // .getProcessesInErrorState();
int lcv = 0;
if (lProcesses != null)
{
for (lcv = 0; lcv < lProcesses.size(); lcv++)
{
if (lProcesses.get(lcv).processName.contentEquals(sProcName))
{
bRet = false;
break;
}
}
}
return (bRet);
}
public String fixFileName(String fileName)
{
String sRet = "";
String sTmpFileName = "";
sRet = fileName.replace('\\', '/');
if (sRet.startsWith("/"))
sTmpFileName = sRet;
else
sTmpFileName = currentDir + "/" + sRet;
sRet = sTmpFileName.replace('\\', '/');
sTmpFileName = sRet;
sRet = sTmpFileName.replace("//", "/");
return(sRet);
}
public String GetTmpDir()
{
String sRet = "";
Context ctx = getApplicationContext();
File dir = ctx.getFilesDir();
ctx = null;
try {
sRet = dir.getCanonicalPath();
}
catch (IOException e)
{
e.printStackTrace();
}
return(sRet);
}
public String UnInstallApp(String sApp, OutputStream out)
{
String sRet = "";
String [] theArgs = new String [3];
theArgs[0] = "su";
theArgs[1] = "-c";
theArgs[2] = "pm uninstall " + sApp + ";exit";
try
{
pProc = Runtime.getRuntime().exec(theArgs);
RedirOutputThread outThrd = new RedirOutputThread(pProc, out);
outThrd.start();
outThrd.join(60000);
int nRet = pProc.exitValue();
sRet = "\nuninst complete [" + nRet + "]";
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return (sRet);
}
public String InstallApp(String sApp, OutputStream out)
{
String sRet = "";
String sHold = "";
String [] theArgs = new String [3];
theArgs[0] = "su";
theArgs[1] = "-c";
theArgs[2] = "pm install " + sApp + ";exit";
try
{
pProc = Runtime.getRuntime().exec(theArgs);
RedirOutputThread outThrd = new RedirOutputThread(pProc, out);
outThrd.start();
outThrd.join(180000);
int nRet = pProc.exitValue();
sRet += "\ninstall complete [" + nRet + "]";
sHold = outThrd.strOutput;
sRet += "\nSuccess";
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return (sRet);
}
private String SendPing(String sIPAddr)
{
Process pProc;
String sRet = "";
String [] theArgs = new String [4];
boolean bStillRunning = true;
int nBytesOut = 0;
int nBytesErr = 0;
int nBytesRead = 0;
byte[] buffer = new byte[1024];
theArgs[0] = "ping";
theArgs[1] = "-c";
theArgs[2] = "3";
theArgs[3] = sIPAddr;
try
{
pProc = Runtime.getRuntime().exec(theArgs);
InputStream sutOut = pProc.getInputStream();
InputStream sutErr = pProc.getErrorStream();
while (bStillRunning)
{
try
{
if ((nBytesOut = sutOut.available()) > 0)
{
if (nBytesOut > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesOut];
}
nBytesRead = sutOut.read(buffer, 0, nBytesOut);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
if ((nBytesErr = sutErr.available()) > 0)
{
if (nBytesErr > buffer.length)
{
buffer = null;
System.gc();
buffer = new byte[nBytesErr];
}
nBytesRead = sutErr.read(buffer, 0, nBytesErr);
if (nBytesRead == -1)
bStillRunning = false;
else
{
String sRep = new String(buffer,0,nBytesRead).replace("\n", "\r\n");
sRet += sRep;
sRep = null;
}
}
bStillRunning = (IsProcRunning(pProc) || (sutOut.available() > 0) || (sutErr.available() > 0));
}
catch (IOException e)
{
e.printStackTrace();
}
if ((bStillRunning == true) && (nBytesErr == 0) && (nBytesOut == 0))
{
try {
Thread.sleep(2000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
pProc.destroy();
pProc = null;
}
catch (IOException e)
{
sRet = e.getMessage();
e.printStackTrace();
}
return (sRet);
}
private boolean IsProcRunning(Process pProc)
{
boolean bRet = false;
@SuppressWarnings("unused")
int nExitCode = 0;
try
{
nExitCode = pProc.exitValue();
}
catch (IllegalThreadStateException z)
{
bRet = true;
}
catch (Exception e)
{
e.printStackTrace();
}
return(bRet);
}
private class UpdateApplication implements Runnable {
Thread runner;
String msPkgName = "";
String msPkgFileName = "";
String msOutFile = "";
int mbReboot = 0;
public UpdateApplication(String sPkgName, String sPkgFileName, String sOutFile, int bReboot) {
runner = new Thread(this);
msPkgName = sPkgName;
msPkgFileName = sPkgFileName;
msOutFile = sOutFile;
mbReboot = bReboot;
runner.start();
}
public void run() {
bInstalling = true;
UpdtApp(msPkgName, msPkgFileName, msOutFile, mbReboot);
bInstalling = false;
}
}
private class MyTime extends TimerTask
{
int nStrikes = 0;
public MyTime()
{
}
@Override
public void run()
{
if (bInstalling)
return;
// See if the network is up, if not after three failures reboot
String sRet = SendPing(sPingTarget);
if (!sRet.contains("3 received"))
{
if (nMaxStrikes > 0)
{
if (++nStrikes >= nMaxStrikes)
RunReboot(null);
}
}
else
{
nStrikes = 0;
}
sRet = null;
String sProgramName = "com.mozilla.SUTAgentAndroid";
PackageManager pm = myContext.getPackageManager();
// Debug.waitForDebugger();
if (!GetProcessInfo(sProgramName))
{
Intent agentIntent = new Intent();
agentIntent.setPackage(sProgramName);
agentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
agentIntent.setAction(Intent.ACTION_MAIN);
try {
PackageInfo pi = pm.getPackageInfo(sProgramName, PackageManager.GET_ACTIVITIES | PackageManager.GET_INTENT_FILTERS);
ActivityInfo [] ai = pi.activities;
for (int i = 0; i < ai.length; i++)
{
ActivityInfo a = ai[i];
if (a.name.length() > 0)
{
agentIntent.setClassName(a.packageName, a.name);
break;
}
}
}
catch (NameNotFoundException e)
{
e.printStackTrace();
}
try
{
myContext.startActivity(agentIntent);
}
catch(ActivityNotFoundException anf)
{
anf.printStackTrace();
}
}
}
}
private void SendNotification(String tickerText, String expandedText) {
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.ateamlogo;
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
// notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
Context context = getApplicationContext();
// Intent to launch an activity when the extended text is clicked
Intent intent = new Intent(this, WatcherService.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent, 0);
notification.setLatestEventInfo(context, tickerText, expandedText, launchIntent);
notificationManager.notify(NOTIFICATION_ID, notification);
}
private void CancelNotification() {
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);
}
}

Просмотреть файл

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-5

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.5 KiB

Двоичные данные
build/mobile/sutagent/android/watcher/res/drawable-hdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.5 KiB

Двоичные данные
build/mobile/sutagent/android/watcher/res/drawable-ldpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.7 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.5 KiB

Двоичные данные
build/mobile/sutagent/android/watcher/res/drawable-mdpi/icon.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Просмотреть файл

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

Просмотреть файл

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, WatcherMain!</string>
<string name="app_name">watcher</string>
<string name="foreground_service_started">Foreground Service Started</string>
</resources>

Просмотреть файл

@ -58,10 +58,11 @@ PROGRAM = crashinject$(BIN_SUFFIX)
USE_STATIC_LIBS = 1
CPPSRCS = crashinject.cpp
endif
endif # ENABLE_TESTS
include $(topsrcdir)/config/rules.mk
ifndef MOZ_MEMORY
ifdef WIN32_REDIST_DIR
ifeq (1400,$(_MSC_VER))
@ -89,11 +90,11 @@ REDIST_FILES = \
$(NULL)
endif
endif
ifdef REDIST_FILES
libs::
mkdir -p $(FINAL_TARGET)
install --preserve-timestamps $(foreach f,$(REDIST_FILES),"$(WIN32_REDIST_DIR)"/$(f)) $(FINAL_TARGET)
endif
endif # WIN32_REDIST_DIR
endif # ! MOZ_MEMORY

Просмотреть файл

@ -72,7 +72,6 @@ endif
CFLAGS += \
-DVC_PATH='"$(subst \,\\,$(VCINSTALLDIR))\\"' \
-DWM_SDK_PATH='"$(subst \,\\,$(WINCE_SDK_DIR))\\"' \
-DOGLES_SDK_PATH='"$(subst \,\\,$(OGLES_SDK_DIR))\\"' \
-DMOZCE_DEVENV='"$(MOZCE_DEVENV)"' \
-DTOPSRCDIR='"$(TOPSRCDIR)"' \
$(NULL)

Просмотреть файл

@ -24,7 +24,6 @@ void addLinkArgs(int k, int s, int *i, int *j, char** args, char** argv) {
args[(*i)++] = "/LIBPATH:\"" WCE_LIB "\"";
args[(*i)++] = "/LIBPATH:\"" WCE_CRT "\"";
args[(*i)++] = "/LIBPATH:\"" ATL_LIB "\"";
args[(*i)++] = "/LIBPATH:\"" OGLES_SDK_LIB "\"";
args[(*i)++] = "/NODEFAULTLIB";
args[(*i)++] = "/MAP";

Просмотреть файл

@ -199,8 +199,8 @@ DWORD run(char** args)
_putenv("LIBPATH=");
_putenv("CC=");
_putenv("INCLUDE=" SHUNT_INC ";" WM_SDK_INC ";" OGLES_SDK_INC ";" WCE_INC);
_putenv("LIB=" WCE_LIB ";" OGLES_SDK_LIB ";" WCE_CRT);
_putenv("INCLUDE=" SHUNT_INC ";" WM_SDK_INC ";" WCE_INC);
_putenv("LIB=" WCE_LIB ";" WCE_CRT);
i = strlen(args[0]);
for (j=0; j<i; j++)

Просмотреть файл

@ -5,8 +5,6 @@
#include <stdio.h>
#include <process.h>
#define OGLES_SDK_INC OGLES_SDK_PATH "inc"
#define OGLES_SDK_LIB OGLES_SDK_PATH "lib\\wince\\nvap\\release"
#define WCE_BIN VC_PATH "ce\\bin\\x86_arm\\"
#define WCE_RC_BIN WIN_SDK_PATH "bin\\"
#define WCE_CRT VC_PATH "ce\\lib\\armv4i"

Просмотреть файл

@ -573,7 +573,6 @@ FT2_LIBS = @FT2_LIBS@
MOZ_PANGO_CFLAGS = @MOZ_PANGO_CFLAGS@
MOZ_PANGO_LIBS = @MOZ_PANGO_LIBS@
MOZ_XIE_LIBS = @MOZ_XIE_LIBS@
XT_LIBS = @XT_LIBS@
MOZ_LIBPROXY_CFLAGS = @MOZ_LIBPROXY_CFLAGS@
@ -626,8 +625,6 @@ AIX_OBJMODEL = @AIX_OBJMODEL@
MOZ_OS2_TOOLS = @MOZ_OS2_TOOLS@
MOZ_OS2_HIGH_MEMORY = @MOZ_OS2_HIGH_MEMORY@
HAVE_XIE=@HAVE_XIE@
MOZ_PSM=@MOZ_PSM@
# Gssapi (krb5) libraries and headers for the Negotiate auth method
@ -660,12 +657,9 @@ MOZ_PHOENIX = @MOZ_PHOENIX@
MOZ_XULRUNNER = @MOZ_XULRUNNER@
WINCE = @WINCE@
WINCE_SDK_DIR = @WINCE_SDK_DIR@
OGLES_SDK_DIR = @OGLES_SDK_DIR@
WINCE_WINDOWS_MOBILE = @WINCE_WINDOWS_MOBILE@
HAS_OGLES = @HAS_OGLES@
MOZ_DISTRIBUTION_ID = @MOZ_DISTRIBUTION_ID@
MOZ_PLATFORM_MAEMO = @MOZ_PLATFORM_MAEMO@

Просмотреть файл

@ -612,10 +612,6 @@ DEPENDENCIES = .md
MOZ_COMPONENT_LIBS=$(XPCOM_LIBS) $(MOZ_COMPONENT_NSPR_LIBS)
ifeq (xpconnect, $(findstring xpconnect, $(BUILD_MODULES)))
DEFINES += -DXPCONNECT_STANDALONE
endif
ifeq ($(OS_ARCH),OS2)
ELF_DYNSTR_GC = echo
else

Просмотреть файл

@ -992,7 +992,7 @@ endif
else # !WINNT || GNU_CC
ifeq ($(CPP_PROG_LINK),1)
$(EXPAND_CCC) -o $@ $(CXXFLAGS) $(WRAP_MALLOC_CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(WRAP_MALLOC_LIB) $(EXE_DEF_FILE)
$(call CHECK_STDCXX,$@)
@$(call CHECK_STDCXX,$@)
else # ! CPP_PROG_LINK
$(EXPAND_CC) -o $@ $(CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(BIN_FLAGS) $(EXE_DEF_FILE)
endif # CPP_PROG_LINK
@ -1058,7 +1058,7 @@ endif # MSVC with manifest tool
else
ifeq ($(CPP_PROG_LINK),1)
$(EXPAND_CCC) $(WRAP_MALLOC_CFLAGS) $(CXXFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(WRAP_MALLOC_LIB) $(BIN_FLAGS)
$(call CHECK_STDCXX,$@)
@$(call CHECK_STDCXX,$@)
else
$(EXPAND_CC) $(WRAP_MALLOC_CFLAGS) $(CFLAGS) $(OUTOPTION)$@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(LIBS_DIR) $(LIBS) $(OS_LIBS) $(EXTRA_LIBS) $(WRAP_MALLOC_LIB) $(BIN_FLAGS)
endif # CPP_PROG_LINK
@ -1179,7 +1179,7 @@ endif
else # ! DTRACE_LIB_DEPENDENT
$(EXPAND_MKSHLIB) $(SHLIB_LDSTARTFILE) $(OBJS) $(DTRACE_PROBE_OBJ) $(LOBJS) $(SUB_SHLOBJS) $(RESFILE) $(LDFLAGS) $(SHARED_LIBRARY_LIBS) $(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) $(DEF_FILE) $(SHLIB_LDENDFILE)
endif # DTRACE_LIB_DEPENDENT
$(call CHECK_STDCXX,$@)
@$(call CHECK_STDCXX,$@)
ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
ifdef MSMANIFEST_TOOL

Просмотреть файл

@ -895,7 +895,6 @@ X11/cursorfont.h
X11/extensions/Print.h
X11/extensions/shape.h
X11/extensions/scrnsaver.h
X11/extensions/XIElib.h
X11/extensions/XShm.h
X11/extensions/Xrender.h
X11/extensions/Xdamage.h

Просмотреть файл

@ -366,11 +366,6 @@ case "$target" in
The path to the Windows CE SDK],
WINCE_SDK_DIR=$withval)
MOZ_ARG_WITH_STRING(ogles-sdk,
[ --with-ogles-sdk=OGLES_SDK_DIR
The path to the OGLES SDK],
OGLES_SDK_DIR=$withval)
AC_DEFINE(WINCE)
export WINCE=1
@ -384,9 +379,9 @@ case "$target" in
_pwd=`pwd -W`
_topsrcdirwin=`cd \`dirname $0\`; pwd -W`
make OGLES_SDK_DIR="$OGLES_SDK_DIR" WINCE_SDK_DIR="$WINCE_SDK_DIR" \
TOPSRCDIR="$_topsrcdirwin" OBJDIR="$_pwd" target="$target" \
-C $srcdir/build/wince/tools
make WINCE_SDK_DIR="$WINCE_SDK_DIR" \
TOPSRCDIR="$_topsrcdirwin" OBJDIR="$_pwd" target="$target" \
-C $srcdir/build/wince/tools
CC="$_pwd/dist/sdk/bin/$target-gcc.exe"
CXX="$_pwd/dist/sdk/bin/$target-gcc.exe"
@ -686,7 +681,10 @@ case "$target" in
AC_DEFINE(HAVE_SEH_EXCEPTIONS)
if test -n "$WIN32_REDIST_DIR"; then
WIN32_REDIST_DIR=`cd "$WIN32_REDIST_DIR" && pwd`
if test ! -d "$WIN32_REDIST_DIR"; then
AC_MSG_ERROR([Invalid Win32 Redist directory: ${WIN32_REDIST_DIR}])
fi
WIN32_REDIST_DIR=`cd "$WIN32_REDIST_DIR" && pwd`
fi
dnl Ensure that mt.exe is 'Microsoft (R) Manifest Tool',
@ -2626,7 +2624,8 @@ ia64*-hpux*)
;;
*-openbsd*)
DLL_SUFFIX=".so.1.0"
DLL_SUFFIX='.so.$(if $(SO_VERSION),$(SO_VERSION),1.0)'
MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib -Wl,-rpath-link,$(if $(X11BASE),$(X11BASE),/usr/X11R6)/lib'
DSO_CFLAGS=''
DSO_PIC_CFLAGS='-fPIC'
DSO_LDOPTS='-shared -fPIC'
@ -3523,26 +3522,6 @@ else
[XSS_LIBS="-lXss $XEXT_LIBS $XLIBS"
AC_DEFINE(HAVE_LIBXSS)],, $XEXT_LIBS $XLIBS))
dnl ========================================================
dnl = Check for XIE
dnl ========================================================
AC_CHECK_LIB(XIE, XieFloGeometry, [MOZ_XIE_LIBS="-lXIE"],,
$XLIBS $XEXT_LIBS)
MOZ_CHECK_HEADER(X11/extensions/XIElib.h)
if test "$MOZ_XIE_LIBS"; then
dnl ====================================================
dnl = If XIE is present and is desired, turn it on
dnl ====================================================
case $target in
*-hpux*)
;;
*)
HAVE_XIE=1
;;
esac
fi
LDFLAGS="$_SAVE_LDFLAGS"
dnl ========================================================
@ -5107,6 +5086,16 @@ else
AC_MSG_RESULT([no])
fi
# Allow someone to change MOZ_APP_NAME in mozconfig
MOZ_ARG_WITH_STRING(app-name,
[--with-app-name=APPNAME sets MOZ_APP_NAME to APPNAME],
WITH_APP_NAME=$withval,
)
if test -n "$WITH_APP_NAME" ; then
MOZ_APP_NAME="$WITH_APP_NAME"
fi
# Now is a good time to test for logic errors, define mismatches, etc.
case "$MOZ_BUILD_APP" in
xulrunner)
@ -7429,8 +7418,15 @@ if test "$NS_TRACE_MALLOC"; then
MOZ_MEMORY=
fi
if test "$MOZ_MEMORY"; then
if test -z "$MOZ_MEMORY"; then
case "${target}" in
*-mingw*)
if test -z "$WIN32_REDIST_DIR"; then
AC_MSG_WARN([When not building jemalloc, you need to set WIN32_REDIST_DIR to the path to the Visual C++ Redist (usually VCINSTALLDIR\redist\x86\Microsoft.VC80.CRT, for VC++ v8) if you intend to distribute your build.])
fi
;;
esac
else
dnl Don't try to run compiler tests on Windows
if test "$OS_ARCH" = "WINNT"; then
if test -z "$HAVE_64BIT_OS"; then
@ -7544,7 +7540,7 @@ if test "$MOZ_MEMORY"; then
AC_DEFINE(HAVE_JEMALLOC_POSIX_MEMALIGN)
AC_DEFINE(HAVE_JEMALLOC_MEMALIGN)
fi
fi
fi # MOZ_MEMORY
AC_SUBST(MOZ_MEMORY)
AC_SUBST(MOZ_MEMORY_LDFLAGS)
AC_SUBST(WIN32_CRT_SRC_DIR)
@ -7720,21 +7716,10 @@ dnl ========================================================
dnl = libstdc++ compatibility hacks
dnl ========================================================
STDCXX_COMPAT=stdc++compat.cpp
MOZ_ARG_DISABLE_BOOL(stdcxx-compat,
[ --disable-stdcxx-compat Disable libstdc++ compatibility],
STDCXX_COMPAT=)
# Disable on platforms where it doesn't make sense
if test -n "$STDCXX_COMPAT"; then
case "${OS_TARGET}" in
Linux)
;;
*)
STDCXX_COMPAT=
;;
esac
fi
STDCXX_COMPAT=
MOZ_ARG_ENABLE_BOOL(stdcxx-compat,
[ --enable-stdcxx-compat Enable compatibility with older libstdc++],
STDCXX_COMPAT=stdc++compat.cpp)
AC_SUBST(STDCXX_COMPAT)
@ -8605,15 +8590,16 @@ if test "$MOZ_TREE_CAIRO"; then
MOZ_ENABLE_CAIRO_FT=1
CAIRO_FT_CFLAGS="$FT2_CFLAGS"
fi
if test "$MOZ_WIDGET_TOOLKIT" = "qt"; then
case "$MOZ_WIDGET_TOOLKIT" in
qt)
QT_SURFACE_FEATURE="#define CAIRO_HAS_QT_SURFACE 1"
fi
if test "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then
;;
cocoa)
QUARTZ_SURFACE_FEATURE="#define CAIRO_HAS_QUARTZ_SURFACE 1"
QUARTZ_IMAGE_SURFACE_FEATURE="#define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1"
QUARTZ_FONT_FEATURE="#define CAIRO_HAS_QUARTZ_FONT 1"
fi
if test "$MOZ_WIDGET_TOOLKIT" = "windows"; then
;;
windows)
WIN32_SURFACE_FEATURE="#define CAIRO_HAS_WIN32_SURFACE 1"
if test -z "$WINCE"; then
WIN32_FONT_FEATURE="#define CAIRO_HAS_WIN32_FONT 1"
@ -8638,15 +8624,15 @@ if test "$MOZ_TREE_CAIRO"; then
if test -n "$WIN32_D2D_SURFACE_FEATURE"; then
MOZ_CHECK_HEADER(d3d10.h, MOZ_ENABLE_D3D10_LAYER=1)
fi
fi
if test "$MOZ_WIDGET_TOOLKIT" = "os2"; then
;;
os2)
OS2_SURFACE_FEATURE="#define CAIRO_HAS_OS2_SURFACE 1"
FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1"
MOZ_ENABLE_CAIRO_FT=1
CAIRO_FT_CFLAGS="-I${MZFTCFGFT2}/include"
CAIRO_FT_LIBS="-L${MZFTCFGFT2}/lib -lmozft -lmzfntcfg"
fi
;;
esac
if test "$USE_FC_FREETYPE"; then
FC_FONT_FEATURE="#define CAIRO_HAS_FC_FONT 1"
fi
@ -8656,7 +8642,6 @@ if test "$MOZ_TREE_CAIRO"; then
AC_SUBST(MOZ_ENABLE_D3D9_LAYER)
AC_SUBST(MOZ_ENABLE_D3D10_LAYER)
AC_SUBST(CAIRO_FT_CFLAGS)
AC_SUBST(HAS_OGLES)
if test "$MOZ_DEBUG"; then
SANITY_CHECKING_FEATURE="#define CAIRO_DO_SANITY_CHECKING 1"
@ -8997,9 +8982,6 @@ AC_SUBST(JAR)
AC_SUBST(MOZ_PROFILELOCKING)
AC_SUBST(HAVE_XIE)
AC_SUBST(MOZ_XIE_LIBS)
AC_SUBST(BUILD_STATIC_LIBS)
AC_SUBST(MOZ_ENABLE_LIBXUL)
AC_SUBST(ENABLE_TESTS)
@ -9042,7 +9024,6 @@ AC_SUBST(MOZ_OS2_TOOLS)
AC_SUBST(MOZ_POST_DSO_LIB_COMMAND)
AC_SUBST(MOZ_POST_PROGRAM_COMMAND)
AC_SUBST(MOZ_TIMELINE)
AC_SUBST(OGLES_SDK_DIR)
AC_SUBST(MOZ_APP_NAME)
AC_SUBST(MOZ_APP_DISPLAYNAME)

Просмотреть файл

@ -990,6 +990,15 @@ public:
*/
static PRUint32 GetEventId(nsIAtom* aName);
/**
* Return the category for the event with the given name. The name is the
* event name *without* the 'on' prefix. Returns NS_EVENT if the event
* is not known to be in any particular category.
*
* @param aName the event name to look up
*/
static PRUint32 GetEventCategory(const nsAString& aName);
/**
* Return the event id and atom for the event with the given name.
* The name is the event name *without* the 'on' prefix.

Просмотреть файл

@ -3332,6 +3332,17 @@ nsContentUtils::GetEventId(nsIAtom* aName)
return NS_USER_DEFINED_EVENT;
}
// static
PRUint32
nsContentUtils::GetEventCategory(const nsAString& aName)
{
EventNameMapping mapping;
if (sStringEventTable->Get(aName, &mapping))
return mapping.mStructType;
return NS_EVENT;
}
nsIAtom*
nsContentUtils::GetEventIdAndAtom(const nsAString& aName,
PRUint32 aEventStruct,

Просмотреть файл

@ -6179,16 +6179,6 @@ nsDocument::NormalizeDocument()
return Normalize();
}
NS_IMETHODIMP
nsDocument::RenameNode(nsIDOMNode *aNode,
const nsAString& namespaceURI,
const nsAString& qualifiedName,
nsIDOMNode **aReturn)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDocument::GetOwnerDocument(nsIDOMDocument** aOwnerDocument)
{

Просмотреть файл

@ -475,6 +475,7 @@ _TEST_FILES2 = \
test_bug604592.html \
test_bug628938.html \
test_bug626262.html \
test_plugin_freezing.html \
$(NULL)
# This test fails on the Mac for some reason
@ -483,9 +484,6 @@ _TEST_FILES2 += test_copyimage.html \
$(NULL)
endif
# Disabled; see bug 492181
# test_plugin_freezing.html
# Disabled for now. Mochitest isn't reliable enough for these.
# test_bug444546.html \
# bug444546.sjs \

Просмотреть файл

@ -38,10 +38,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=430050
document.getElementById('b').loadURI('data:text/plain,succeeded',
null,
'UTF-8');
setTimeout(endTest, 0);
}
}, true);
document.documentElement.setAttribute("foo", "bar");
setTimeout(endTest, 100);
}
SimpleTest.waitForExplicitFinish();

Просмотреть файл

@ -13,7 +13,7 @@ function handleRequest(request, response) {
' parent.done();' +
' document.close();' +
'}' +
'setTimeout(doWrite, 1);' +
'setTimeout(doWrite, 0);' +
'</script>'
);

Просмотреть файл

@ -35,10 +35,10 @@ document.addEventListener('readystatechange', function(event) {
window.addEventListener('readystatechange', function(event) {
ok(false, 'window listener', 'readystatechange event should not bubble to window');
}, false);
setTimeout(function() {
addLoadEvent(function() {
is(i, states.length, 'readystatechange event count');
SimpleTest.finish();
}, 1000);
});
</script>
</pre>

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше