--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/java_plat/java_superd_parser_api/inc/javasuperdparser.h Thu Jan 07 16:18:57 2010 +0200
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: CJavaSuperDParser definition.
+*
+*/
+
+
+#ifndef C_JAVASUPERDPARSER_H
+#define C_JAVASUPERDPARSER_H
+
+#include <e32base.h>
+#include <f32file.h>
+#include <s32strm.h>
+#include <e32std.h>
+
+class CZipFile;
+class CZipFileMember;
+
+namespace Java
+{
+
+/**
+ * CJavaSuperDParser includes methods for parsing SuperD packages.
+ *
+ * This class includes methods for creating a superdistributable JAR
+ * package and also methods for parsing a superdistributable JAR
+ * package when installing it.
+ *
+ * A superdistributable JAR package is in uncompressed ZIP format
+ * containing:
+ * -# a manifest file (META-INF/MANIFEST.MF),
+ * -# a JAD file and
+ * -# either a plaintext JAR file or a JAR file in DCF.
+ *
+ * The manifest file must have the following attributes:
+ * -# Distribution-Package: <SuperD version number>
+ * -# Distribution-Descriptor-Filename: <JAD file name>
+ * -# Distribution-Content-Filename: <JAR file name>
+ *
+ * To create a superdistributable jar package use the static method
+ * CreateSuperDPackageL:
+ * @code
+ * using namespace Java;
+ * CJavaSuperDParser::CreateSuperDPackageL( RFs& aFileSession,
+ * const TDesC& aDestinationFileName,
+ * const TDesC& aJadFileName,
+ * const TDesC& aJarFileName );
+ * @endcode
+ *
+ * To parse a superdistributable jar package:
+ * @code
+ * using namespace Java;
+ * CJavaSuperDParser* parser( NULL );
+ * TRAPD( err, parser = CJavaSuperDParser::NewL( aFileSession,
+ * KSuperDFile,
+ * KDestinationDir ) );
+ * if ( !err )
+ * {
+ * // Now you know that KSuperDFile is a superdistributable package.
+ * // JAD and JAR file have been written in KDestinationDir.
+ * }
+ * delete parser;
+ * @endcode
+ *
+ * CJavaSuperDParser was renamed from CJcfSuperDParser.
+ *
+ * @lib javadrmutils.lib
+ * @since S60 v3.2
+ */
+NONSHARABLE_CLASS(CJavaSuperDParser) : public CBase
+{
+
+public:
+
+ /**
+ * First phase constructor. Creates a CJavaSuperDParser object, parses
+ * the SuperD package and extracts its contents to the specified
+ * folder.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ * @param aJarFileName Filename of the file containing SuperD
+ * package
+ * @param aDestinationFolder Folder where descriptor and content
+ * files will be saved
+ * @return The newly created CJavaSuperDParser object handle
+ * @leave KErrCorrupt If supplied file is not a SuperD package
+ */
+ IMPORT_C static CJavaSuperDParser* NewL(RFs& aFileSession,
+ const TDesC& aJarFileName,
+ const TDesC& aDestinationFolder);
+
+ /**
+ * First phase constructor. Creates a CJavaSuperDParser object, parses
+ * the SuperD package and extracts its contents to the specified
+ * folder.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ * @param aJarFileHandle File handle of the file containing SuperD
+ * package
+ * @param aDestinationFolder Folder where descriptor and content
+ * files will be saved
+ * @return The newly created CJavaSuperDParser object handle
+ * @leave KErrCorrupt If supplied file is not a SuperD package
+ */
+ IMPORT_C static CJavaSuperDParser* NewL(RFs& aFileSession,
+ RFile& aJarFileHandle,
+ const TDesC& aDestinationFolder);
+
+ /**
+ * Destructor. Frees allocated resources.
+ *
+ * @since S60 v3.2
+ */
+ virtual ~CJavaSuperDParser();
+
+ /**
+ * Creates a superdistribution package from the given JAD and JAR file.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ * @param aDestinationFileName Filename of the destination SuperD
+ * package.
+ * @param aDescriptorFileName JAD file name
+ * @param aContentFileName JAR file name
+ */
+ IMPORT_C static void CreateSuperDPackageL(RFs& aFileSession,
+ const TDesC& aDestinationFileName,
+ const TDesC& aDescriptorFileName,
+ const TDesC& aContentFileName);
+
+ /**
+ * Returns the name of the JAD file in the SuperD package parsed by
+ * this object.
+ *
+ * @since S60 v3.2
+ * @return Descriptor file name
+ */
+ IMPORT_C TFileName DescriptorFileName() const;
+
+ /**
+ * Returns the name of the JAR file in the SuperD package parsed by
+ * this object.
+ *
+ * @since S60 v3.2
+ * @return Content file name
+ */
+ IMPORT_C TFileName ContentFileName() const;
+
+private:
+
+ /**
+ * Private C++ constructor.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ */
+ CJavaSuperDParser(RFs& aFileSession);
+
+ /**
+ * Second phase Symbian constructor. Extracts the contents of the
+ * SuperD package into the destination folder.
+ *
+ * @since S60 v3.2
+ * @param aJarFileName File name of SuperD package in the files system
+ * @param aDestinationFolder Files from the package will be extracted
+ * here.
+ * @leave KErrCorrupt If supplied file is not a SuperD package
+ */
+ void ConstructL(const TDesC& aJarFileName,
+ const TDesC& aDestinationFolder);
+
+ /**
+ * Second phase Symbian constructor. Checks and extracts the contents
+ * of the SuperD package into the destination folder with
+ * ParseZipFileL.
+ *
+ * @since S60 v3.2
+ * @param aJarFileHandle File handle to the SuperD package
+ * @param aDestinationFolder Files from the package will be extracted
+ * here.
+ * @leave KErrCorrupt If supplied file is not a SuperD package
+ */
+ void ConstructL(RFile& aJarFileHandle,
+ const TDesC& aDestinationFolder);
+
+ /**
+ * Calculates the CRC of a given file according to zip specification.
+ *
+ * @since S60 v3.2
+ * @param aFile File to calculate the CRC for
+ * @return CRC value
+ */
+ static TUint32 CalculateCRC(RFile& aFile);
+
+ /**
+ * Creates and writes the MANIFEST.MF file for the SuperD package.
+ * The manifest file contains the following three lines:
+ * -# Distribution-Package: <SuperD version number>
+ * -# Distribution-Descriptor-Filename: <JAD file name>
+ * -# Distribution-Content-Filename: <JAR file name>
+ *
+ * This function creates a META-INF/MANIFEST.MF (in the META-INF
+ * directory inside the SuperD JAR file with the structure above,
+ * and writes it to a RWriteStream with WriteEntryAndUpdateIndexL.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ * @param aStream File write stream where the manifest file will be
+ * written
+ * @param aCurrentOffset Offset where to start to write in the write
+ * stream
+ * @param aZipIndex The zip file index
+ * @param aRelativeJadFileName Name of the JAD file with relative path
+ * @param aRelativeJarFileName Name of the JAR file with relative path
+ */
+ static void CreateAndWriteManifestL(RFs& aFileSession,
+ RWriteStream& aStream,
+ TInt& aCurrentOffset,
+ HBufC8*& aZipIndex,
+ const TDesC8& aRelativeJadFileName,
+ const TDesC8& aRelativeJarFileName);
+ /**
+ * Writes an entry (file or directory) to the zip file stream and
+ * updates the zip file index.
+ *
+ * @since S60 v3.2
+ * @param aFileSession File session handle to be used by this object
+ * @param aStream ZIP file write stream where the entry will be written
+ * @param aCurrentOffset Offset where to start to write
+ * @param aZipIndex The zip file index
+ * @param aRelativeFileName Relative name of the entry inside the ZIP
+ * file
+ * @param aFileName Name of the file in the file system which will be
+ * written in the ZIP file. Use NULL to create a directory.
+ */
+ static void WriteEntryAndUpdateIndexL(RFs& aFileSession,
+ RWriteStream& aStream,
+ TInt& aCurrentOffset,
+ HBufC8*& aZipIndex,
+ const TDesC8& aRelativeFileName,
+ const TDesC* aFileName);
+ /**
+ * Writes the ZIP index entry to the ZIP output stream. The ZIP index
+ * should be the last entry in the ZIP file.
+ *
+ * @since S60 v3.2
+ * @param aStream ZIP file write stream where the entry will be written
+ * @param aCurrentOffset Offset where to start to write
+ * @param aZipIndex The zip file index which will be written in the stream
+ */
+ static void WriteIndexL(RWriteStream& aStream,
+ TInt aCurrentOffset,
+ const HBufC8* aZipIndex);
+
+ /**
+ * Checks and parses the contents of the SuperD package.
+ *
+ * @since S60 v3.2
+ * @param aDestinationFolder Files from the package will be extracted
+ * here.
+ */
+ void ParseZipFileL(const TDesC& aDestinationFolder);
+
+ /**
+ * Checks from the manifest file that this is a SuperD package.
+ * Extracts the JAD and JAR file name from the manifest file in the
+ * SuperD package and checks wether the package version is compatible
+ * with the parser.
+ *
+ * @since S60 v3.2
+ * @param aManifest The manifest file entry in the ZIP file.
+ */
+ void ParseManifestL(CZipFileMember* aManifest);
+
+ /**
+ * Extracts the JAD and the JAR file from the SuperD package to the
+ * destination folder.
+ *
+ * @since S60 v3.2
+ * @param aDestinationFolder Destination folder name.
+ */
+ void WriteFileL(const TDesC& aDestinationFolder);
+
+private: // data
+
+ /**
+ * File session handle to be used by this object.
+ * Not own.
+ */
+ RFs& iFileSession;
+
+ /**
+ * Zip file object.
+ * Own.
+ */
+ CZipFile* iZipFile;
+
+ /**
+ * JAD file entry in the SuperD package.
+ * Own.
+ */
+ CZipFileMember* iJadMember;
+
+ /**
+ * JAR file entry in the SuperD package.
+ * Own.
+ */
+ CZipFileMember* iJarMember;
+
+ /**
+ * Shows wether there is a valid manifest file in the package.
+ */
+ TBool iManifestFound;
+
+ /**
+ * Name of the JAD file in the SuperD package.
+ */
+ TFileName iDescriptorFileName;
+
+ /**
+ * Name of the JAR file in the SuperD package.
+ */
+ TFileName iContentFileName;
+
+};
+
+}
+
+#endif // C_JAVASUPERDPARSER_H
+
+// End of File