#!/bin/sh
# *************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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.
#  
# *************************************************************


if  [ $# = 0 ]
then
echo "usage: send_ooo path_to_pkg_folder

The files 
installed, 
ooo_bundled_extension.xml,
svc-ooo_bundled_extension
must be in the current directory. The pkg.depotd or the service
application/pkg/server must listen to port 80"

exit
fi


EXTENSIONPATH=/opt/openoffice.org3/share/extension/install

eval `pkgsend -s http://localhost:80 open ooo_test@3.2-1`
pkgsend -s http://localhost:80 import $1/openofficeorg-ure
pkgsend -s http://localhost:80 import $1/ooobasis*
pkgsend -s http://localhost:80 import $1/openofficeorg3*

pkgsend -s http://localhost:80 add file installed   mode=644 owner=root group=bin path=${EXTENSIONPATH}/installed restart_fmri=svc:/application/ooo_bundled_extensions:default
pkgsend -s http://localhost:80 add file svc-ooo_bundled_extensions mode=744 owner=root group=bin path=/lib/svc/method/svc-ooo_bundled_extensions
pkgsend -s http://localhost:80 add file ooo_bundled_extensions.xml mode=644 owner=root group=bin path=/var/svc/manifest/application/ooo_bundled_extensions.xml restart_fmri=svc:/system/manifest-import:default

pkgsend -s http://localhost:80 add set name=description value="OOo 3.2 with dictionaries:  en fr es da de"
pkgsend -s http://localhost:80 close

