--- /dev/null
+.svn
+iptd_html/3rd-party-apps/
+iptd_html/WEB-INF/
+iptd_html/css/
+iptd_html/docs/
+iptd_html/favicon.ico
+iptd_html/index.html
+iptd_html/iui/
+iptd_html/mobile/
+iptd_html/qunit/
+iptd_html/qutests/
+iptd_html/samples/
+iptd_html/test/
+iptd_html/tutorials/
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{8163C948-FA6C-4660-8FDF-67ADBC74F151}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>GUI</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ <TargetName>iPTd</TargetName>\r
+ <IncludePath>$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ <LibraryPath>$(OutDir);$(SolutionDir)/lib/libxml/lib;$(LibraryPath)</LibraryPath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>Use</PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>Use</PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>Use</PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ <AdditionalDependencies>ws2_32.lib;libRaym.lib;libxml2.lib;dllGlobalHook.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\iPTd\TrayApp.h" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ResourceCompile Include="GUI.rc" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Image Include="GUI.ico" />\r
+ <Image Include="small.ico" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\iPTd\TrayApp.cpp" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="リソース ファイル">\r
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+ </Filter>\r
+ <Filter Include="ry0">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ <Filter Include="ry0\iPTd">\r
+ <UniqueIdentifier>{0c8fcb6d-e71b-4eed-a4a9-7fcdd18987ff}</UniqueIdentifier>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\iPTd\TrayApp.h">\r
+ <Filter>ry0\iPTd</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ResourceCompile Include="GUI.rc">\r
+ <Filter>リソース ファイル</Filter>\r
+ </ResourceCompile>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Image Include="small.ico">\r
+ <Filter>リソース ファイル</Filter>\r
+ </Image>\r
+ <Image Include="GUI.ico">\r
+ <Filter>リソース ファイル</Filter>\r
+ </Image>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\iPTd\TrayApp.cpp">\r
+ <Filter>ry0\iPTd</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+========================================================================\r
+ Win32 アプリケーション: GUI プロジェクトの概要\r
+========================================================================\r
+\r
+この GUI アプリケーションは、AppWizard により作成されました。\r
+\r
+このファイルには、GUI アプリケーションを構成する各ファイルの内容の概要が含まれています。\r
+\r
+\r
+GUI.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+GUI.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+GUI.cpp\r
+ これは、メインのアプリケーション ソース ファイルです。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+AppWizard によって、次のリソースが作成されました。\r
+\r
+GUI.rc\r
+ これは、プログラムが使用するすべての Microsoft Windows リソースの一覧です。RES サブディレクトリに格納されるアイコン、ビットマップ、およびカーソルをインクルードしています。このファイルは、Microsoft Visual C++ で直接編集できます。\r
+\r
+Resource.h\r
+ これは、新しいリソース ID を定義する標準のヘッダー ファイルです。このファイルの読み込みおよび更新は、Microsoft Visual C++ で行います。\r
+\r
+GUI.ico\r
+ これは、アプリケーションのアイコン (32x32) として使用されるアイコン ファイルです。このアイコンは、メイン リソース ファイル GUI.rc にインクルードされます。\r
+\r
+small.ico\r
+ これは、アプリケーションのアイコンの小さいバージョン (16x16) を含むアイコン ファイルです。このアイコンは、メイン リソース ファイル GUI.rc にインクルードされます。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他の標準ファイル :\r
+\r
+StdAfx.h, StdAfx.cpp\r
+ これらのファイルは、GUI.pch という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj という名前のプリコンパイル済みの型ファイルをビルドするために使用されます。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>Main Menu</key>
+ <string>メインメニュー</string>
+ <key>Reservation</key>
+ <string>録画予約</string>
+ <key>New Reservation</key>
+ <string>新規予約</string>
+ <key>Keywords</key>
+ <string>キーワード</string>
+ <key>Add</key>
+ <string>追加</string>
+ <key>Registration</key>
+ <string>登録</string>
+ <key>Tuner Status</key>
+ <string>チューナ状態</string>
+ <key>Tuner</key>
+ <string>チューナ</string>
+ <key>Station Name</key>
+ <string>放送局</string>
+ <key>Date</key>
+ <string>日 付</string>
+ <key>Start Time</key>
+ <string>開 始</string>
+ <key>End Time</key>
+ <string>終 了</string>
+ <key>Stop</key>
+ <string>停止</string>
+ <key>Cancel</key>
+ <string>取り消し</string>
+ <key>Delete</key>
+ <string>削除</string>
+ <key>Programs</key>
+ <string>番組表</string>
+ <key>TV</key>
+ <string>テレビ</string>
+ <key>Video</key>
+ <string>ビデオ</string>
+ <key>Digital Terrestrial Television Broadcasting</key>
+ <string>地デジ</string>
+ <key>Broadcasting Time</key>
+ <string>放送時間</string>
+ <key>Program Title</key>
+ <string>番組名</string>
+ <key>Description</key>
+ <string>概要</string>
+ <key>Repeat</key>
+ <string>繰返し</string>
+ <key>Repeat_off</key>
+ <string>なし</string>
+ <key>Repeat_everyday</key>
+ <string>毎日</string>
+ <key>Repeat_weekly</key>
+ <string>毎週</string>
+ <key>Repeat_weekday</key>
+ <string>月〜金</string>
+</dict>
+</plist>
--- /dev/null
+========================================================================\r
+ コンソール アプリケーション: iPTd_R3 プロジェクトの概要\r
+========================================================================\r
+\r
+この iPTd_R3 アプリケーションは、AppWizard により作成されました。\r
+\r
+このファイルには、iPTd_R3 アプリケーションを構成する各ファイルの内容の概要が含まれています。\r
+\r
+\r
+iPTd_R3.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+iPTd_R3.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+iPTd_R3.cpp\r
+ これは、メインのアプリケーション ソース ファイルです。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他の標準ファイル :\r
+\r
+StdAfx.h, StdAfx.cpp\r
+ これらのファイルは、iPTd_R3.pch という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj という名前のプリコンパイル済みの型ファイルをビルドするために使用されます。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+LIBRARY GlobalHook\r
+\r
+SECTIONS\r
+ .GBLHOOK READ WRITE SHARED
\ No newline at end of file
--- /dev/null
+========================================================================\r
+ ダイナミック リンク ライブラリ: dllGlobalHook プロジェクトの概要\r
+========================================================================\r
+\r
+この dllGlobalHook DLL は、AppWizard により作成されました。\r
+\r
+このファイルには、dllGlobalHook アプリケーションを構成する各ファイルの内容の概要が含まれています。\r
+\r
+\r
+dllGlobalHook.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+dllGlobalHook.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+dllGlobalHook.cpp\r
+ これは、メインの DLL ソース ファイルです。\r
+\r
+ この DLL の作成時には、シンボルがエクスポートされません。その結果、ビルド時に .lib ファイルが生成されません。このプロジェクトを他のプロジェクトの依存関係に追加する場合は、コードを追加して DLL からシンボルをエクスポートし、エクスポート ライブラリが生成されるようにするか、またはプロジェクトの [プロパティ ページ] ダイアログ ボックスにある [リンカー] フォルダーの [全般] プロパティ ページで、"インポート ライブラリの無視" プロパティを [はい] に設定します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他の標準ファイル :\r
+\r
+StdAfx.h, StdAfx.cpp\r
+ これらのファイルは、dllGlobalHook.pch という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj という名前のプリコンパイル済みの型ファイルをビルドするために使用されます。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{FF026983-E285-4B84-A632-C17DE917C7CE}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>dllGlobalHook</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ <IncludePath>$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DLLGLOBALHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;DLLGLOBALHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DLLGLOBALHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;DLLGLOBALHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\Raym\GlobalHook.h" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\Raym\GlobalHook.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <None Include="GlobalHook.def" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="リソース ファイル">\r
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+ </Filter>\r
+ <Filter Include="Raym">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\Raym\GlobalHook.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\Raym\GlobalHook.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <None Include="GlobalHook.def">\r
+ <Filter>Raym</Filter>\r
+ </None>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+/**\r
+ * @file iPTd_R3.cpp\r
+ *\r
+ */\r
+\r
+#include <ry0/iPTd/Controller.h>\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ return ServiceMain(ry0::iPTd::Controller, TEXT("iptd_core"), argc, argv);\r
+}\r
+\r
--- /dev/null
+\r
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 14\r
+VisualStudioVersion = 14.0.23107.0\r
+MinimumVisualStudioVersion = 10.0.40219.1\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iPTd_R3", "iPTd_R3.vcxproj", "{5D6DC970-7105-49D3-8401-D1385DD61BB1}"\r
+ ProjectSection(ProjectDependencies) = postProject\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712} = {76AE5E06-6231-4726-B972-BCCDC7281712}\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39} = {2296E419-5E96-4B8C-879A-54DE855D1A39}\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD} = {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B} = {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}\r
+ EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libRaym", "libRaym\libRaym.vcxproj", "{2296E419-5E96-4B8C-879A-54DE855D1A39}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libPT1", "libPT1\libPT1.vcxproj", "{3479E7B7-A39D-4366-AE0E-18AFCD5521BD}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libPT3", "libPT3\libPT3.vcxproj", "{76AE5E06-6231-4726-B972-BCCDC7281712}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libARIB", "libARIB\libARIB.vcxproj", "{B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUI", "GUI\GUI.vcxproj", "{8163C948-FA6C-4660-8FDF-67ADBC74F151}"\r
+ ProjectSection(ProjectDependencies) = postProject\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39} = {2296E419-5E96-4B8C-879A-54DE855D1A39}\r
+ EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dllGlobalHook", "dllGlobalHook\dllGlobalHook.vcxproj", "{FF026983-E285-4B84-A632-C17DE917C7CE}"\r
+EndProject\r
+Global\r
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+ Debug|x64 = Debug|x64\r
+ Debug|x86 = Debug|x86\r
+ Release|x64 = Release|x64\r
+ Release|x86 = Release|x86\r
+ EndGlobalSection\r
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Debug|x64.ActiveCfg = Debug|x64\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Debug|x64.Build.0 = Debug|x64\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Debug|x86.Build.0 = Debug|Win32\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Release|x64.ActiveCfg = Release|x64\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Release|x64.Build.0 = Release|x64\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Release|x86.ActiveCfg = Release|x64\r
+ {5D6DC970-7105-49D3-8401-D1385DD61BB1}.Release|x86.Build.0 = Release|x64\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Debug|x64.ActiveCfg = Debug|x64\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Debug|x64.Build.0 = Debug|x64\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Debug|x86.Build.0 = Debug|Win32\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Release|x64.ActiveCfg = Release|x64\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Release|x64.Build.0 = Release|x64\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Release|x86.ActiveCfg = Release|Win32\r
+ {2296E419-5E96-4B8C-879A-54DE855D1A39}.Release|x86.Build.0 = Release|Win32\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Debug|x64.ActiveCfg = Debug|x64\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Debug|x64.Build.0 = Debug|x64\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Debug|x86.Build.0 = Debug|Win32\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Release|x64.ActiveCfg = Release|x64\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Release|x64.Build.0 = Release|x64\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Release|x86.ActiveCfg = Release|Win32\r
+ {3479E7B7-A39D-4366-AE0E-18AFCD5521BD}.Release|x86.Build.0 = Release|Win32\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Debug|x64.ActiveCfg = Debug|x64\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Debug|x64.Build.0 = Debug|x64\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Debug|x86.Build.0 = Debug|Win32\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Release|x64.ActiveCfg = Release|x64\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Release|x64.Build.0 = Release|x64\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Release|x86.ActiveCfg = Release|Win32\r
+ {76AE5E06-6231-4726-B972-BCCDC7281712}.Release|x86.Build.0 = Release|Win32\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Debug|x64.ActiveCfg = Debug|x64\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Debug|x64.Build.0 = Debug|x64\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Debug|x86.Build.0 = Debug|Win32\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Release|x64.ActiveCfg = Release|x64\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Release|x64.Build.0 = Release|x64\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Release|x86.ActiveCfg = Release|Win32\r
+ {B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}.Release|x86.Build.0 = Release|Win32\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Debug|x64.ActiveCfg = Debug|x64\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Debug|x64.Build.0 = Debug|x64\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Debug|x86.Build.0 = Debug|Win32\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Release|x64.ActiveCfg = Release|x64\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Release|x64.Build.0 = Release|x64\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Release|x86.ActiveCfg = Release|Win32\r
+ {8163C948-FA6C-4660-8FDF-67ADBC74F151}.Release|x86.Build.0 = Release|Win32\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Debug|x64.ActiveCfg = Debug|x64\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Debug|x64.Build.0 = Debug|x64\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Debug|x86.ActiveCfg = Debug|Win32\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Debug|x86.Build.0 = Debug|Win32\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Release|x64.ActiveCfg = Release|x64\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Release|x64.Build.0 = Release|x64\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Release|x86.ActiveCfg = Release|Win32\r
+ {FF026983-E285-4B84-A632-C17DE917C7CE}.Release|x86.Build.0 = Release|Win32\r
+ EndGlobalSection\r
+ GlobalSection(SolutionProperties) = preSolution\r
+ HideSolutionNode = FALSE\r
+ EndGlobalSection\r
+EndGlobal\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{5D6DC970-7105-49D3-8401-D1385DD61BB1}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>iPTd_R3</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>Application</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ <TargetName>iptd_core</TargetName>\r
+ <IncludePath>$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ <LibraryPath>$(OutDir);$(SolutionDir)/lib/libxml/lib;$(LibraryPath)</LibraryPath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Console</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Console</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Console</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Console</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ <AdditionalDependencies>ws2_32.lib;Iphlpapi.lib;libRaym.lib;libxml2.lib;libARIB.lib;libPT1.lib;libPT3.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="iPTd_R3.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\Demultiplexer.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\EIT.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\Header.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\PAT.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\PMT.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\SDT.cpp" />\r
+ <ClCompile Include="src\mpeg2\ts\Table.cpp" />\r
+ <ClCompile Include="src\net\HTTPDaemon.cpp" />\r
+ <ClCompile Include="src\net\HTTPRequest.cpp" />\r
+ <ClCompile Include="src\net\HTTPResponse.cpp" />\r
+ <ClCompile Include="src\net\InternetTextMessage.cpp" />\r
+ <ClCompile Include="src\net\InternetTextMessageBody.cpp" />\r
+ <ClCompile Include="src\net\InternetTextMessageHeader.cpp" />\r
+ <ClCompile Include="src\net\RTSPRequest.cpp" />\r
+ <ClCompile Include="src\ry0\device\Tuner.cpp" />\r
+ <ClCompile Include="src\ry0\device\TunerFactory.cpp" />\r
+ <ClCompile Include="src\ry0\iPTd\Analyzer.cpp" />\r
+ <ClCompile Include="src\ry0\iPTd\CommandRunner.cpp" />\r
+ <ClCompile Include="src\ry0\iPTd\Controller.cpp" />\r
+ <ClCompile Include="src\ry0\iPTd\FFmpeg.cpp" />\r
+ <ClCompile Include="src\ry0\iPTd\HTTPLiveStreaming.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="src\mpeg2\ts\Demultiplexer.h" />\r
+ <ClInclude Include="src\mpeg2\ts\EIT.h" />\r
+ <ClInclude Include="src\mpeg2\ts\Header.h" />\r
+ <ClInclude Include="src\mpeg2\ts\PAT.h" />\r
+ <ClInclude Include="src\mpeg2\ts\PMT.h" />\r
+ <ClInclude Include="src\mpeg2\ts\SDT.h" />\r
+ <ClInclude Include="src\mpeg2\ts\Table.h" />\r
+ <ClInclude Include="src\net\HTTPDaemon.h" />\r
+ <ClInclude Include="src\net\HTTPRequest.h" />\r
+ <ClInclude Include="src\net\HTTPResponse.h" />\r
+ <ClInclude Include="src\net\InternetTextMessage.h" />\r
+ <ClInclude Include="src\net\InternetTextMessageBody.h" />\r
+ <ClInclude Include="src\net\InternetTextMessageHeader.h" />\r
+ <ClInclude Include="src\net\RTSPRequest.h" />\r
+ <ClInclude Include="src\ry0\device\Tuner.h" />\r
+ <ClInclude Include="src\ry0\device\TunerFactory.h" />\r
+ <ClInclude Include="src\ry0\iPTd\Analyzer.h" />\r
+ <ClInclude Include="src\ry0\iPTd\CommandRunner.h" />\r
+ <ClInclude Include="src\ry0\iPTd\Controller.h" />\r
+ <ClInclude Include="src\ry0\iPTd\FFmpeg.h" />\r
+ <ClInclude Include="src\ry0\iPTd\HTTPLiveStreaming.h" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>\r
+<html>\r
+<head>\r
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+ <title>%%TITLE%%</title>\r
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>\r
+ <link rel="icon" type="image/png" href="iui/iui-favicon.png">\r
+ <link rel="apple-touch-icon" href="iui/iui-logo-touch-icon.png" />\r
+ <link rel="stylesheet" href="iui/iui.css" type="text/css" />\r
+ <link rel="stylesheet" title="Default" href="iui/t/default/default-theme.css" type="text/css"/>\r
+ <link rel="stylesheet" href="css/iui-panel-list.css" type="text/css" />\r
+ <style type="text/css">\r
+.panel p.normalText { text-align: left; padding: 0 10px 0 10px; }\r
+ </style>\r
+ <script type="text/javascript">\r
+ var _gaq = _gaq || [];\r
+ _gaq.push(['_setAccount', 'UA-8634743-10'], ['_trackPageview']);\r
+ </script>\r
+ <script type="text/javascript">\r
+ (function() {\r
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\r
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\r
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\r
+ })();\r
+ </script>\r
+</head>\r
+<body>\r
+ <div class="toolbar">\r
+ <h1 id="pageTitle">%%PAGE_TITLE%%</h1>\r
+ <a id="backButton" class="button" href="#"></a>\r
+ </div>\r
+\r
+ %%CONTENTS%%\r
+<!--\r
+<div id="home" class="panel" selected="true">\r
+\r
+ <fieldset>\r
+ <p class="normalText"><b>Welcome to the iUI Demo Site.</b></p>\r
+ </fieldset>\r
+ <h2>Featured Sample Apps</h2>\r
+ <ul>\r
+ <li><a target="_blank" href="samples/music/music.html">Music Sample</a></li>\r
+ <li><a target="_blank" href="samples/digg/index.html">Digg Sample</a></li>\r
+ </ul>\r
+ <h2>Samples & Tests</h2>\r
+ <ul>\r
+ <li><a target="_blank" href="mobile/demos.html">All Samples & Tests</a></li>\r
+ </ul>\r
+ <h2>Other iUI Sites</h2>\r
+ <ul>\r
+ <li><a target="_blank" href="http://www.iui-js.org">iUI Project Website</a></li>\r
+ <li><a target="_blank" href="http://code.google.com/p/iui/">iUI on Google Code</a></li>\r
+ </ul>\r
+ <h2>About This Page</h2>\r
+ <fieldset>\r
+ <p class="normalText">This page is using iUI in CSS-only mode and supports a wide range of desktop and mobile browsers. The other pages on this site require modern, W3C-compliant mobile browsers.</p>\r
+ <p class="normalText">Current Version: iUI 0.4</p>\r
+ </fieldset>\r
+\r
+</div>\r
+-->\r
+\r
+</body>\r
+</html>\r
--- /dev/null
+<!DOCTYPE html>
+<html manifest="music.manifest">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>%%TITLE%%</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
+<link rel="icon" type="image/png" href="../../iui/iui-favicon.png">
+<link rel="apple-touch-icon" href="../../iui/iui-logo-touch-icon.png" />
+<meta name="apple-mobile-web-app-capable" content="yes" />
+<link rel="stylesheet" href="../../iui/iui.css" type="text/css" />
+
+<link rel="stylesheet" id="iui-theme" title="iUI Theme" href="../../iui/t/default/default-theme.css" type="text/css"/>
+<script type="application/x-javascript" src="../../iui/iui.js"></script>
+<script type="application/x-javascript" src="../../iui/js/iui-theme-switcher.js"></script>
+<script type="application/x-javascript">iui.ts.basePath = "../../iui/";</script>
+<script type="application/x-javascript" src="../../iui/ext-sandbox/cache-manager/iui-cache-manager.js"></script>
+<script type="application/x-javascript" src="music-app.js"></script>
+<!--
+<script type="application/x-javascript" src="http://10.0.1.2:1840/ibug.js"></script>
+-->
+</head>
+
+<body>
+ <div class="toolbar">
+ <h1 id="pageTitle"></h1>
+ <a id="backButton" class="button" href="#"></a>
+ <a class="button" target="_self" href="/">Main Menu</a>
+ </div>
+
+ %%CONTENTS%%
+
+</body>
+</html>
--- /dev/null
+/* Copyright (C) 1999-2003 Free Software Foundation, Inc.
+ This file is part of the GNU LIBICONV Library.
+
+ The GNU LIBICONV Library is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ The GNU LIBICONV Library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU LIBICONV Library; see the file COPYING.LIB.
+ If not, write to the Free Software Foundation, Inc., 59 Temple Place -
+ Suite 330, Boston, MA 02111-1307, USA. */
+
+/* When installed, this file is called "iconv.h". */
+
+#ifndef _LIBICONV_H
+#define _LIBICONV_H
+
+#define _LIBICONV_VERSION 0x0109 /* version number: (major<<8) + minor */
+extern int _libiconv_version; /* Likewise */
+
+/* We would like to #include any system header file which could define
+ iconv_t, 1. in order to eliminate the risk that the user gets compilation
+ errors because some other system header file includes /usr/include/iconv.h
+ which defines iconv_t or declares iconv after this file, 2. when compiling
+ for LIBICONV_PLUG, we need the proper iconv_t type in order to produce
+ binary compatible code.
+ But gcc's #include_next is not portable. Thus, once libiconv's iconv.h
+ has been installed in /usr/local/include, there is no way any more to
+ include the original /usr/include/iconv.h. We simply have to get away
+ without it.
+ Ad 1. The risk that a system header file does
+ #include "iconv.h" or #include_next "iconv.h"
+ is small. They all do #include <iconv.h>.
+ Ad 2. The iconv_t type is a pointer type in all cases I have seen. (It
+ has to be a scalar type because (iconv_t)(-1) is a possible return value
+ from iconv_open().) */
+
+/* Define iconv_t ourselves. */
+#undef iconv_t
+#define iconv_t libiconv_t
+typedef void* iconv_t;
+
+/* Get size_t declaration. */
+#include <stddef.h>
+
+/* Get errno declaration and values. */
+#include <errno.h>
+/* Some systems, like SunOS 4, don't have EILSEQ. Some systems, like BSD/OS,
+ have EILSEQ in a different header. On these systems, define EILSEQ
+ ourselves. */
+#ifndef EILSEQ
+/* Igor: called upon EILSEQ from glibc, since autogeneration of this header
+ on Windows didn't do the job. */
+/* #define EILSEQ @EILSEQ@ */
+#define EILSEQ 84
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Allocates descriptor for code conversion from encoding `fromcode' to
+ encoding `tocode'. */
+#ifndef LIBICONV_PLUG
+#define iconv_open libiconv_open
+#endif
+extern iconv_t iconv_open (const char* tocode, const char* fromcode);
+
+/* Converts, using conversion descriptor `cd', at most `*inbytesleft' bytes
+ starting at `*inbuf', writing at most `*outbytesleft' bytes starting at
+ `*outbuf'.
+ Decrements `*inbytesleft' and increments `*inbuf' by the same amount.
+ Decrements `*outbytesleft' and increments `*outbuf' by the same amount. */
+#ifndef LIBICONV_PLUG
+#define iconv libiconv
+#endif
+extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
+
+/* Frees resources allocated for conversion descriptor `cd'. */
+#ifndef LIBICONV_PLUG
+#define iconv_close libiconv_close
+#endif
+extern int iconv_close (iconv_t cd);
+
+
+#ifndef LIBICONV_PLUG
+
+/* Nonstandard extensions. */
+
+/* Control of attributes. */
+#define iconvctl libiconvctl
+extern int iconvctl (iconv_t cd, int request, void* argument);
+
+/* Requests for iconvctl. */
+#define ICONV_TRIVIALP 0 /* int *argument */
+#define ICONV_GET_TRANSLITERATE 1 /* int *argument */
+#define ICONV_SET_TRANSLITERATE 2 /* const int *argument */
+#define ICONV_GET_DISCARD_ILSEQ 3 /* int *argument */
+#define ICONV_SET_DISCARD_ILSEQ 4 /* const int *argument */
+
+/* Listing of locale independent encodings. */
+#define iconvlist libiconvlist
+extern void iconvlist (int (*do_one) (unsigned int namescount,
+ const char * const * names,
+ void* data),
+ void* data);
+
+/* Support for relocatable packages. */
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+extern void libiconv_set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LIBICONV_H */
--- /dev/null
+/*
+ * Summary: old DocBook SGML parser
+ * Description: interface for a DocBook SGML non-verifying parser
+ * This code is DEPRECATED, and should not be used anymore.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __DOCB_PARSER_H__
+#define __DOCB_PARSER_H__
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_DOCB_ENABLED
+
+#include <libxml/parser.h>
+#include <libxml/parserInternals.h>
+
+#ifndef IN_LIBXML
+#ifdef __GNUC__
+#warning "The DOCBparser module has been deprecated in libxml2-2.6.0"
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Most of the back-end structures from XML and SGML are shared.
+ */
+typedef xmlParserCtxt docbParserCtxt;
+typedef xmlParserCtxtPtr docbParserCtxtPtr;
+typedef xmlSAXHandler docbSAXHandler;
+typedef xmlSAXHandlerPtr docbSAXHandlerPtr;
+typedef xmlParserInput docbParserInput;
+typedef xmlParserInputPtr docbParserInputPtr;
+typedef xmlDocPtr docbDocPtr;
+
+/*
+ * There is only few public functions.
+ */
+XMLPUBFUN int XMLCALL
+ docbEncodeEntities(unsigned char *out,
+ int *outlen,
+ const unsigned char *in,
+ int *inlen, int quoteChar);
+
+XMLPUBFUN docbDocPtr XMLCALL
+ docbSAXParseDoc (xmlChar *cur,
+ const char *encoding,
+ docbSAXHandlerPtr sax,
+ void *userData);
+XMLPUBFUN docbDocPtr XMLCALL
+ docbParseDoc (xmlChar *cur,
+ const char *encoding);
+XMLPUBFUN docbDocPtr XMLCALL
+ docbSAXParseFile (const char *filename,
+ const char *encoding,
+ docbSAXHandlerPtr sax,
+ void *userData);
+XMLPUBFUN docbDocPtr XMLCALL
+ docbParseFile (const char *filename,
+ const char *encoding);
+
+/**
+ * Interfaces for the Push mode.
+ */
+XMLPUBFUN void XMLCALL
+ docbFreeParserCtxt (docbParserCtxtPtr ctxt);
+XMLPUBFUN docbParserCtxtPtr XMLCALL
+ docbCreatePushParserCtxt(docbSAXHandlerPtr sax,
+ void *user_data,
+ const char *chunk,
+ int size,
+ const char *filename,
+ xmlCharEncoding enc);
+XMLPUBFUN int XMLCALL
+ docbParseChunk (docbParserCtxtPtr ctxt,
+ const char *chunk,
+ int size,
+ int terminate);
+XMLPUBFUN docbParserCtxtPtr XMLCALL
+ docbCreateFileParserCtxt(const char *filename,
+ const char *encoding);
+XMLPUBFUN int XMLCALL
+ docbParseDocument (docbParserCtxtPtr ctxt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_DOCB_ENABLED */
+
+#endif /* __DOCB_PARSER_H__ */
--- /dev/null
+/*
+ * Summary: interface for an HTML 4.0 non-verifying parser
+ * Description: this module implements an HTML 4.0 non-verifying parser
+ * with API compatible with the XML parser ones. It should
+ * be able to parse "real world" HTML, even if severely
+ * broken from a specification point of view.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __HTML_PARSER_H__
+#define __HTML_PARSER_H__
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+
+#ifdef LIBXML_HTML_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Most of the back-end structures from XML and HTML are shared.
+ */
+typedef xmlParserCtxt htmlParserCtxt;
+typedef xmlParserCtxtPtr htmlParserCtxtPtr;
+typedef xmlParserNodeInfo htmlParserNodeInfo;
+typedef xmlSAXHandler htmlSAXHandler;
+typedef xmlSAXHandlerPtr htmlSAXHandlerPtr;
+typedef xmlParserInput htmlParserInput;
+typedef xmlParserInputPtr htmlParserInputPtr;
+typedef xmlDocPtr htmlDocPtr;
+typedef xmlNodePtr htmlNodePtr;
+
+/*
+ * Internal description of an HTML element, representing HTML 4.01
+ * and XHTML 1.0 (which share the same structure).
+ */
+typedef struct _htmlElemDesc htmlElemDesc;
+typedef htmlElemDesc *htmlElemDescPtr;
+struct _htmlElemDesc {
+ const char *name; /* The tag name */
+ char startTag; /* Whether the start tag can be implied */
+ char endTag; /* Whether the end tag can be implied */
+ char saveEndTag; /* Whether the end tag should be saved */
+ char empty; /* Is this an empty element ? */
+ char depr; /* Is this a deprecated element ? */
+ char dtd; /* 1: only in Loose DTD, 2: only Frameset one */
+ char isinline; /* is this a block 0 or inline 1 element */
+ const char *desc; /* the description */
+
+/* NRK Jan.2003
+ * New fields encapsulating HTML structure
+ *
+ * Bugs:
+ * This is a very limited representation. It fails to tell us when
+ * an element *requires* subelements (we only have whether they're
+ * allowed or not), and it doesn't tell us where CDATA and PCDATA
+ * are allowed. Some element relationships are not fully represented:
+ * these are flagged with the word MODIFIER
+ */
+ const char** subelts; /* allowed sub-elements of this element */
+ const char* defaultsubelt; /* subelement for suggested auto-repair
+ if necessary or NULL */
+ const char** attrs_opt; /* Optional Attributes */
+ const char** attrs_depr; /* Additional deprecated attributes */
+ const char** attrs_req; /* Required attributes */
+};
+
+/*
+ * Internal description of an HTML entity.
+ */
+typedef struct _htmlEntityDesc htmlEntityDesc;
+typedef htmlEntityDesc *htmlEntityDescPtr;
+struct _htmlEntityDesc {
+ unsigned int value; /* the UNICODE value for the character */
+ const char *name; /* The entity name */
+ const char *desc; /* the description */
+};
+
+/*
+ * There is only few public functions.
+ */
+XMLPUBFUN const htmlElemDesc * XMLCALL
+ htmlTagLookup (const xmlChar *tag);
+XMLPUBFUN const htmlEntityDesc * XMLCALL
+ htmlEntityLookup(const xmlChar *name);
+XMLPUBFUN const htmlEntityDesc * XMLCALL
+ htmlEntityValueLookup(unsigned int value);
+
+XMLPUBFUN int XMLCALL
+ htmlIsAutoClosed(htmlDocPtr doc,
+ htmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ htmlAutoCloseTag(htmlDocPtr doc,
+ const xmlChar *name,
+ htmlNodePtr elem);
+XMLPUBFUN const htmlEntityDesc * XMLCALL
+ htmlParseEntityRef(htmlParserCtxtPtr ctxt,
+ const xmlChar **str);
+XMLPUBFUN int XMLCALL
+ htmlParseCharRef(htmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ htmlParseElement(htmlParserCtxtPtr ctxt);
+
+XMLPUBFUN htmlParserCtxtPtr XMLCALL
+ htmlNewParserCtxt(void);
+
+XMLPUBFUN htmlParserCtxtPtr XMLCALL
+ htmlCreateMemoryParserCtxt(const char *buffer,
+ int size);
+
+XMLPUBFUN int XMLCALL
+ htmlParseDocument(htmlParserCtxtPtr ctxt);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlSAXParseDoc (xmlChar *cur,
+ const char *encoding,
+ htmlSAXHandlerPtr sax,
+ void *userData);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlParseDoc (xmlChar *cur,
+ const char *encoding);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlSAXParseFile(const char *filename,
+ const char *encoding,
+ htmlSAXHandlerPtr sax,
+ void *userData);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlParseFile (const char *filename,
+ const char *encoding);
+XMLPUBFUN int XMLCALL
+ UTF8ToHtml (unsigned char *out,
+ int *outlen,
+ const unsigned char *in,
+ int *inlen);
+XMLPUBFUN int XMLCALL
+ htmlEncodeEntities(unsigned char *out,
+ int *outlen,
+ const unsigned char *in,
+ int *inlen, int quoteChar);
+XMLPUBFUN int XMLCALL
+ htmlIsScriptAttribute(const xmlChar *name);
+XMLPUBFUN int XMLCALL
+ htmlHandleOmittedElem(int val);
+
+#ifdef LIBXML_PUSH_ENABLED
+/**
+ * Interfaces for the Push mode.
+ */
+XMLPUBFUN htmlParserCtxtPtr XMLCALL
+ htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *chunk,
+ int size,
+ const char *filename,
+ xmlCharEncoding enc);
+XMLPUBFUN int XMLCALL
+ htmlParseChunk (htmlParserCtxtPtr ctxt,
+ const char *chunk,
+ int size,
+ int terminate);
+#endif /* LIBXML_PUSH_ENABLED */
+
+XMLPUBFUN void XMLCALL
+ htmlFreeParserCtxt (htmlParserCtxtPtr ctxt);
+
+/*
+ * New set of simpler/more flexible APIs
+ */
+/**
+ * xmlParserOption:
+ *
+ * This is the set of XML parser options that can be passed down
+ * to the xmlReadDoc() and similar calls.
+ */
+typedef enum {
+ HTML_PARSE_RECOVER = 1<<0, /* Relaxed parsing */
+ HTML_PARSE_NODEFDTD = 1<<2, /* do not default a doctype if not found */
+ HTML_PARSE_NOERROR = 1<<5, /* suppress error reports */
+ HTML_PARSE_NOWARNING= 1<<6, /* suppress warning reports */
+ HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */
+ HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */
+ HTML_PARSE_NONET = 1<<11,/* Forbid network access */
+ HTML_PARSE_NOIMPLIED= 1<<13,/* Do not add implied html/body... elements */
+ HTML_PARSE_COMPACT = 1<<16,/* compact small text nodes */
+ HTML_PARSE_IGNORE_ENC=1<<21 /* ignore internal document encoding hint */
+} htmlParserOption;
+
+XMLPUBFUN void XMLCALL
+ htmlCtxtReset (htmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ htmlCtxtUseOptions (htmlParserCtxtPtr ctxt,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlReadDoc (const xmlChar *cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlReadFile (const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlReadMemory (const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlReadFd (int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlReadIO (xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlCtxtReadDoc (xmlParserCtxtPtr ctxt,
+ const xmlChar *cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlCtxtReadFile (xmlParserCtxtPtr ctxt,
+ const char *filename,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlCtxtReadMemory (xmlParserCtxtPtr ctxt,
+ const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlCtxtReadFd (xmlParserCtxtPtr ctxt,
+ int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlCtxtReadIO (xmlParserCtxtPtr ctxt,
+ xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+
+/* NRK/Jan2003: further knowledge of HTML structure
+ */
+typedef enum {
+ HTML_NA = 0 , /* something we don't check at all */
+ HTML_INVALID = 0x1 ,
+ HTML_DEPRECATED = 0x2 ,
+ HTML_VALID = 0x4 ,
+ HTML_REQUIRED = 0xc /* VALID bit set so ( & HTML_VALID ) is TRUE */
+} htmlStatus ;
+
+/* Using htmlElemDesc rather than name here, to emphasise the fact
+ that otherwise there's a lookup overhead
+*/
+XMLPUBFUN htmlStatus XMLCALL htmlAttrAllowed(const htmlElemDesc*, const xmlChar*, int) ;
+XMLPUBFUN int XMLCALL htmlElementAllowedHere(const htmlElemDesc*, const xmlChar*) ;
+XMLPUBFUN htmlStatus XMLCALL htmlElementStatusHere(const htmlElemDesc*, const htmlElemDesc*) ;
+XMLPUBFUN htmlStatus XMLCALL htmlNodeStatus(const htmlNodePtr, int) ;
+/**
+ * htmlDefaultSubelement:
+ * @elt: HTML element
+ *
+ * Returns the default subelement for this element
+ */
+#define htmlDefaultSubelement(elt) elt->defaultsubelt
+/**
+ * htmlElementAllowedHereDesc:
+ * @parent: HTML parent element
+ * @elt: HTML element
+ *
+ * Checks whether an HTML element description may be a
+ * direct child of the specified element.
+ *
+ * Returns 1 if allowed; 0 otherwise.
+ */
+#define htmlElementAllowedHereDesc(parent,elt) \
+ htmlElementAllowedHere((parent), (elt)->name)
+/**
+ * htmlRequiredAttrs:
+ * @elt: HTML element
+ *
+ * Returns the attributes required for the specified element.
+ */
+#define htmlRequiredAttrs(elt) (elt)->attrs_req
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_HTML_ENABLED */
+#endif /* __HTML_PARSER_H__ */
--- /dev/null
+/*
+ * Summary: specific APIs to process HTML tree, especially serialization
+ * Description: this module implements a few function needed to process
+ * tree in an HTML specific way.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __HTML_TREE_H__
+#define __HTML_TREE_H__
+
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/HTMLparser.h>
+
+#ifdef LIBXML_HTML_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * HTML_TEXT_NODE:
+ *
+ * Macro. A text node in a HTML document is really implemented
+ * the same way as a text node in an XML document.
+ */
+#define HTML_TEXT_NODE XML_TEXT_NODE
+/**
+ * HTML_ENTITY_REF_NODE:
+ *
+ * Macro. An entity reference in a HTML document is really implemented
+ * the same way as an entity reference in an XML document.
+ */
+#define HTML_ENTITY_REF_NODE XML_ENTITY_REF_NODE
+/**
+ * HTML_COMMENT_NODE:
+ *
+ * Macro. A comment in a HTML document is really implemented
+ * the same way as a comment in an XML document.
+ */
+#define HTML_COMMENT_NODE XML_COMMENT_NODE
+/**
+ * HTML_PRESERVE_NODE:
+ *
+ * Macro. A preserved node in a HTML document is really implemented
+ * the same way as a CDATA section in an XML document.
+ */
+#define HTML_PRESERVE_NODE XML_CDATA_SECTION_NODE
+/**
+ * HTML_PI_NODE:
+ *
+ * Macro. A processing instruction in a HTML document is really implemented
+ * the same way as a processing instruction in an XML document.
+ */
+#define HTML_PI_NODE XML_PI_NODE
+
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlNewDoc (const xmlChar *URI,
+ const xmlChar *ExternalID);
+XMLPUBFUN htmlDocPtr XMLCALL
+ htmlNewDocNoDtD (const xmlChar *URI,
+ const xmlChar *ExternalID);
+XMLPUBFUN const xmlChar * XMLCALL
+ htmlGetMetaEncoding (htmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ htmlSetMetaEncoding (htmlDocPtr doc,
+ const xmlChar *encoding);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ htmlDocDumpMemory (xmlDocPtr cur,
+ xmlChar **mem,
+ int *size);
+XMLPUBFUN void XMLCALL
+ htmlDocDumpMemoryFormat (xmlDocPtr cur,
+ xmlChar **mem,
+ int *size,
+ int format);
+XMLPUBFUN int XMLCALL
+ htmlDocDump (FILE *f,
+ xmlDocPtr cur);
+XMLPUBFUN int XMLCALL
+ htmlSaveFile (const char *filename,
+ xmlDocPtr cur);
+XMLPUBFUN int XMLCALL
+ htmlNodeDump (xmlBufferPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur);
+XMLPUBFUN void XMLCALL
+ htmlNodeDumpFile (FILE *out,
+ xmlDocPtr doc,
+ xmlNodePtr cur);
+XMLPUBFUN int XMLCALL
+ htmlNodeDumpFileFormat (FILE *out,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ const char *encoding,
+ int format);
+XMLPUBFUN int XMLCALL
+ htmlSaveFileEnc (const char *filename,
+ xmlDocPtr cur,
+ const char *encoding);
+XMLPUBFUN int XMLCALL
+ htmlSaveFileFormat (const char *filename,
+ xmlDocPtr cur,
+ const char *encoding,
+ int format);
+
+XMLPUBFUN void XMLCALL
+ htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ const char *encoding,
+ int format);
+XMLPUBFUN void XMLCALL
+ htmlDocContentDumpOutput(xmlOutputBufferPtr buf,
+ xmlDocPtr cur,
+ const char *encoding);
+XMLPUBFUN void XMLCALL
+ htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf,
+ xmlDocPtr cur,
+ const char *encoding,
+ int format);
+XMLPUBFUN void XMLCALL
+ htmlNodeDumpOutput (xmlOutputBufferPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ const char *encoding);
+
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+XMLPUBFUN int XMLCALL
+ htmlIsBooleanAttr (const xmlChar *name);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_HTML_ENABLED */
+
+#endif /* __HTML_TREE_H__ */
+
--- /dev/null
+/*
+ * Summary: Old SAX version 1 handler, deprecated
+ * Description: DEPRECATED set of SAX version 1 interfaces used to
+ * build the DOM tree.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SAX_H__
+#define __XML_SAX_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/xlink.h>
+
+#ifdef LIBXML_LEGACY_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+XMLPUBFUN const xmlChar * XMLCALL
+ getPublicId (void *ctx);
+XMLPUBFUN const xmlChar * XMLCALL
+ getSystemId (void *ctx);
+XMLPUBFUN void XMLCALL
+ setDocumentLocator (void *ctx,
+ xmlSAXLocatorPtr loc);
+
+XMLPUBFUN int XMLCALL
+ getLineNumber (void *ctx);
+XMLPUBFUN int XMLCALL
+ getColumnNumber (void *ctx);
+
+XMLPUBFUN int XMLCALL
+ isStandalone (void *ctx);
+XMLPUBFUN int XMLCALL
+ hasInternalSubset (void *ctx);
+XMLPUBFUN int XMLCALL
+ hasExternalSubset (void *ctx);
+
+XMLPUBFUN void XMLCALL
+ internalSubset (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN void XMLCALL
+ externalSubset (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ getEntity (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ getParameterEntity (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ resolveEntity (void *ctx,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+
+XMLPUBFUN void XMLCALL
+ entityDecl (void *ctx,
+ const xmlChar *name,
+ int type,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ xmlChar *content);
+XMLPUBFUN void XMLCALL
+ attributeDecl (void *ctx,
+ const xmlChar *elem,
+ const xmlChar *fullname,
+ int type,
+ int def,
+ const xmlChar *defaultValue,
+ xmlEnumerationPtr tree);
+XMLPUBFUN void XMLCALL
+ elementDecl (void *ctx,
+ const xmlChar *name,
+ int type,
+ xmlElementContentPtr content);
+XMLPUBFUN void XMLCALL
+ notationDecl (void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+XMLPUBFUN void XMLCALL
+ unparsedEntityDecl (void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ const xmlChar *notationName);
+
+XMLPUBFUN void XMLCALL
+ startDocument (void *ctx);
+XMLPUBFUN void XMLCALL
+ endDocument (void *ctx);
+XMLPUBFUN void XMLCALL
+ attribute (void *ctx,
+ const xmlChar *fullname,
+ const xmlChar *value);
+XMLPUBFUN void XMLCALL
+ startElement (void *ctx,
+ const xmlChar *fullname,
+ const xmlChar **atts);
+XMLPUBFUN void XMLCALL
+ endElement (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN void XMLCALL
+ reference (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN void XMLCALL
+ characters (void *ctx,
+ const xmlChar *ch,
+ int len);
+XMLPUBFUN void XMLCALL
+ ignorableWhitespace (void *ctx,
+ const xmlChar *ch,
+ int len);
+XMLPUBFUN void XMLCALL
+ processingInstruction (void *ctx,
+ const xmlChar *target,
+ const xmlChar *data);
+XMLPUBFUN void XMLCALL
+ globalNamespace (void *ctx,
+ const xmlChar *href,
+ const xmlChar *prefix);
+XMLPUBFUN void XMLCALL
+ setNamespace (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN xmlNsPtr XMLCALL
+ getNamespace (void *ctx);
+XMLPUBFUN int XMLCALL
+ checkNamespace (void *ctx,
+ xmlChar *nameSpace);
+XMLPUBFUN void XMLCALL
+ namespaceDecl (void *ctx,
+ const xmlChar *href,
+ const xmlChar *prefix);
+XMLPUBFUN void XMLCALL
+ comment (void *ctx,
+ const xmlChar *value);
+XMLPUBFUN void XMLCALL
+ cdataBlock (void *ctx,
+ const xmlChar *value,
+ int len);
+
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN void XMLCALL
+ initxmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr,
+ int warning);
+#ifdef LIBXML_HTML_ENABLED
+XMLPUBFUN void XMLCALL
+ inithtmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr);
+#endif
+#ifdef LIBXML_DOCB_ENABLED
+XMLPUBFUN void XMLCALL
+ initdocbDefaultSAXHandler (xmlSAXHandlerV1 *hdlr);
+#endif
+#endif /* LIBXML_SAX1_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_LEGACY_ENABLED */
+
+#endif /* __XML_SAX_H__ */
--- /dev/null
+/*
+ * Summary: SAX2 parser interface used to build the DOM tree
+ * Description: those are the default SAX2 interfaces used by
+ * the library when building DOM tree.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SAX2_H__
+#define __XML_SAX2_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/xlink.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlSAX2GetPublicId (void *ctx);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlSAX2GetSystemId (void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlSAX2SetDocumentLocator (void *ctx,
+ xmlSAXLocatorPtr loc);
+
+XMLPUBFUN int XMLCALL
+ xmlSAX2GetLineNumber (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSAX2GetColumnNumber (void *ctx);
+
+XMLPUBFUN int XMLCALL
+ xmlSAX2IsStandalone (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSAX2HasInternalSubset (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSAX2HasExternalSubset (void *ctx);
+
+XMLPUBFUN void XMLCALL
+ xmlSAX2InternalSubset (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN void XMLCALL
+ xmlSAX2ExternalSubset (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlSAX2GetEntity (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlSAX2GetParameterEntity (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlSAX2ResolveEntity (void *ctx,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+
+XMLPUBFUN void XMLCALL
+ xmlSAX2EntityDecl (void *ctx,
+ const xmlChar *name,
+ int type,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ xmlChar *content);
+XMLPUBFUN void XMLCALL
+ xmlSAX2AttributeDecl (void *ctx,
+ const xmlChar *elem,
+ const xmlChar *fullname,
+ int type,
+ int def,
+ const xmlChar *defaultValue,
+ xmlEnumerationPtr tree);
+XMLPUBFUN void XMLCALL
+ xmlSAX2ElementDecl (void *ctx,
+ const xmlChar *name,
+ int type,
+ xmlElementContentPtr content);
+XMLPUBFUN void XMLCALL
+ xmlSAX2NotationDecl (void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+XMLPUBFUN void XMLCALL
+ xmlSAX2UnparsedEntityDecl (void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ const xmlChar *notationName);
+
+XMLPUBFUN void XMLCALL
+ xmlSAX2StartDocument (void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlSAX2EndDocument (void *ctx);
+#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED)
+XMLPUBFUN void XMLCALL
+ xmlSAX2StartElement (void *ctx,
+ const xmlChar *fullname,
+ const xmlChar **atts);
+XMLPUBFUN void XMLCALL
+ xmlSAX2EndElement (void *ctx,
+ const xmlChar *name);
+#endif /* LIBXML_SAX1_ENABLED or LIBXML_HTML_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlSAX2StartElementNs (void *ctx,
+ const xmlChar *localname,
+ const xmlChar *prefix,
+ const xmlChar *URI,
+ int nb_namespaces,
+ const xmlChar **namespaces,
+ int nb_attributes,
+ int nb_defaulted,
+ const xmlChar **attributes);
+XMLPUBFUN void XMLCALL
+ xmlSAX2EndElementNs (void *ctx,
+ const xmlChar *localname,
+ const xmlChar *prefix,
+ const xmlChar *URI);
+XMLPUBFUN void XMLCALL
+ xmlSAX2Reference (void *ctx,
+ const xmlChar *name);
+XMLPUBFUN void XMLCALL
+ xmlSAX2Characters (void *ctx,
+ const xmlChar *ch,
+ int len);
+XMLPUBFUN void XMLCALL
+ xmlSAX2IgnorableWhitespace (void *ctx,
+ const xmlChar *ch,
+ int len);
+XMLPUBFUN void XMLCALL
+ xmlSAX2ProcessingInstruction (void *ctx,
+ const xmlChar *target,
+ const xmlChar *data);
+XMLPUBFUN void XMLCALL
+ xmlSAX2Comment (void *ctx,
+ const xmlChar *value);
+XMLPUBFUN void XMLCALL
+ xmlSAX2CDataBlock (void *ctx,
+ const xmlChar *value,
+ int len);
+
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlSAXDefaultVersion (int version);
+#endif /* LIBXML_SAX1_ENABLED */
+
+XMLPUBFUN int XMLCALL
+ xmlSAXVersion (xmlSAXHandler *hdlr,
+ int version);
+XMLPUBFUN void XMLCALL
+ xmlSAX2InitDefaultSAXHandler (xmlSAXHandler *hdlr,
+ int warning);
+#ifdef LIBXML_HTML_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr);
+XMLPUBFUN void XMLCALL
+ htmlDefaultSAXHandlerInit (void);
+#endif
+#ifdef LIBXML_DOCB_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr);
+XMLPUBFUN void XMLCALL
+ docbDefaultSAXHandlerInit (void);
+#endif
+XMLPUBFUN void XMLCALL
+ xmlDefaultSAXHandlerInit (void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_SAX2_H__ */
--- /dev/null
+/*
+ * Summary: Provide Canonical XML and Exclusive XML Canonicalization
+ * Description: the c14n modules provides a
+ *
+ * "Canonical XML" implementation
+ * http://www.w3.org/TR/xml-c14n
+ *
+ * and an
+ *
+ * "Exclusive XML Canonicalization" implementation
+ * http://www.w3.org/TR/xml-exc-c14n
+
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Aleksey Sanin <aleksey@aleksey.com>
+ */
+#ifndef __XML_C14N_H__
+#define __XML_C14N_H__
+#ifdef LIBXML_C14N_ENABLED
+#ifdef LIBXML_OUTPUT_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/xpath.h>
+
+/*
+ * XML Canonicazation
+ * http://www.w3.org/TR/xml-c14n
+ *
+ * Exclusive XML Canonicazation
+ * http://www.w3.org/TR/xml-exc-c14n
+ *
+ * Canonical form of an XML document could be created if and only if
+ * a) default attributes (if any) are added to all nodes
+ * b) all character and parsed entity references are resolved
+ * In order to achive this in libxml2 the document MUST be loaded with
+ * following global setings:
+ *
+ * xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
+ * xmlSubstituteEntitiesDefault(1);
+ *
+ * or corresponding parser context setting:
+ * xmlParserCtxtPtr ctxt;
+ *
+ * ...
+ * ctxt->loadsubset = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
+ * ctxt->replaceEntities = 1;
+ * ...
+ */
+
+/*
+ * xmlC14NMode:
+ *
+ * Predefined values for C14N modes
+ *
+ */
+typedef enum {
+ XML_C14N_1_0 = 0, /* Origianal C14N 1.0 spec */
+ XML_C14N_EXCLUSIVE_1_0 = 1, /* Exclusive C14N 1.0 spec */
+ XML_C14N_1_1 = 2 /* C14N 1.1 spec */
+} xmlC14NMode;
+
+XMLPUBFUN int XMLCALL
+ xmlC14NDocSaveTo (xmlDocPtr doc,
+ xmlNodeSetPtr nodes,
+ int mode, /* a xmlC14NMode */
+ xmlChar **inclusive_ns_prefixes,
+ int with_comments,
+ xmlOutputBufferPtr buf);
+
+XMLPUBFUN int XMLCALL
+ xmlC14NDocDumpMemory (xmlDocPtr doc,
+ xmlNodeSetPtr nodes,
+ int mode, /* a xmlC14NMode */
+ xmlChar **inclusive_ns_prefixes,
+ int with_comments,
+ xmlChar **doc_txt_ptr);
+
+XMLPUBFUN int XMLCALL
+ xmlC14NDocSave (xmlDocPtr doc,
+ xmlNodeSetPtr nodes,
+ int mode, /* a xmlC14NMode */
+ xmlChar **inclusive_ns_prefixes,
+ int with_comments,
+ const char* filename,
+ int compression);
+
+
+/**
+ * This is the core C14N function
+ */
+/**
+ * xmlC14NIsVisibleCallback:
+ * @user_data: user data
+ * @node: the curent node
+ * @parent: the parent node
+ *
+ * Signature for a C14N callback on visible nodes
+ *
+ * Returns 1 if the node should be included
+ */
+typedef int (*xmlC14NIsVisibleCallback) (void* user_data,
+ xmlNodePtr node,
+ xmlNodePtr parent);
+
+XMLPUBFUN int XMLCALL
+ xmlC14NExecute (xmlDocPtr doc,
+ xmlC14NIsVisibleCallback is_visible_callback,
+ void* user_data,
+ int mode, /* a xmlC14NMode */
+ xmlChar **inclusive_ns_prefixes,
+ int with_comments,
+ xmlOutputBufferPtr buf);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LIBXML_OUTPUT_ENABLED */
+#endif /* LIBXML_C14N_ENABLED */
+#endif /* __XML_C14N_H__ */
+
--- /dev/null
+/**
+ * Summary: interfaces to the Catalog handling system
+ * Description: the catalog module implements the support for
+ * XML Catalogs and SGML catalogs
+ *
+ * SGML Open Technical Resolution TR9401:1997.
+ * http://www.jclark.com/sp/catalog.htm
+ *
+ * XML Catalogs Working Draft 06 August 2001
+ * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_CATALOG_H__
+#define __XML_CATALOG_H__
+
+#include <stdio.h>
+
+#include <libxml/xmlversion.h>
+#include <libxml/xmlstring.h>
+#include <libxml/tree.h>
+
+#ifdef LIBXML_CATALOG_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * XML_CATALOGS_NAMESPACE:
+ *
+ * The namespace for the XML Catalogs elements.
+ */
+#define XML_CATALOGS_NAMESPACE \
+ (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog"
+/**
+ * XML_CATALOG_PI:
+ *
+ * The specific XML Catalog Processing Instuction name.
+ */
+#define XML_CATALOG_PI \
+ (const xmlChar *) "oasis-xml-catalog"
+
+/*
+ * The API is voluntarily limited to general cataloging.
+ */
+typedef enum {
+ XML_CATA_PREFER_NONE = 0,
+ XML_CATA_PREFER_PUBLIC = 1,
+ XML_CATA_PREFER_SYSTEM
+} xmlCatalogPrefer;
+
+typedef enum {
+ XML_CATA_ALLOW_NONE = 0,
+ XML_CATA_ALLOW_GLOBAL = 1,
+ XML_CATA_ALLOW_DOCUMENT = 2,
+ XML_CATA_ALLOW_ALL = 3
+} xmlCatalogAllow;
+
+typedef struct _xmlCatalog xmlCatalog;
+typedef xmlCatalog *xmlCatalogPtr;
+
+/*
+ * Operations on a given catalog.
+ */
+XMLPUBFUN xmlCatalogPtr XMLCALL
+ xmlNewCatalog (int sgml);
+XMLPUBFUN xmlCatalogPtr XMLCALL
+ xmlLoadACatalog (const char *filename);
+XMLPUBFUN xmlCatalogPtr XMLCALL
+ xmlLoadSGMLSuperCatalog (const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlConvertSGMLCatalog (xmlCatalogPtr catal);
+XMLPUBFUN int XMLCALL
+ xmlACatalogAdd (xmlCatalogPtr catal,
+ const xmlChar *type,
+ const xmlChar *orig,
+ const xmlChar *replace);
+XMLPUBFUN int XMLCALL
+ xmlACatalogRemove (xmlCatalogPtr catal,
+ const xmlChar *value);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlACatalogResolve (xmlCatalogPtr catal,
+ const xmlChar *pubID,
+ const xmlChar *sysID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlACatalogResolveSystem(xmlCatalogPtr catal,
+ const xmlChar *sysID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlACatalogResolvePublic(xmlCatalogPtr catal,
+ const xmlChar *pubID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlACatalogResolveURI (xmlCatalogPtr catal,
+ const xmlChar *URI);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlACatalogDump (xmlCatalogPtr catal,
+ FILE *out);
+#endif /* LIBXML_OUTPUT_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlFreeCatalog (xmlCatalogPtr catal);
+XMLPUBFUN int XMLCALL
+ xmlCatalogIsEmpty (xmlCatalogPtr catal);
+
+/*
+ * Global operations.
+ */
+XMLPUBFUN void XMLCALL
+ xmlInitializeCatalog (void);
+XMLPUBFUN int XMLCALL
+ xmlLoadCatalog (const char *filename);
+XMLPUBFUN void XMLCALL
+ xmlLoadCatalogs (const char *paths);
+XMLPUBFUN void XMLCALL
+ xmlCatalogCleanup (void);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlCatalogDump (FILE *out);
+#endif /* LIBXML_OUTPUT_ENABLED */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogResolve (const xmlChar *pubID,
+ const xmlChar *sysID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogResolveSystem (const xmlChar *sysID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogResolvePublic (const xmlChar *pubID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogResolveURI (const xmlChar *URI);
+XMLPUBFUN int XMLCALL
+ xmlCatalogAdd (const xmlChar *type,
+ const xmlChar *orig,
+ const xmlChar *replace);
+XMLPUBFUN int XMLCALL
+ xmlCatalogRemove (const xmlChar *value);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlParseCatalogFile (const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlCatalogConvert (void);
+
+/*
+ * Strictly minimal interfaces for per-document catalogs used
+ * by the parser.
+ */
+XMLPUBFUN void XMLCALL
+ xmlCatalogFreeLocal (void *catalogs);
+XMLPUBFUN void * XMLCALL
+ xmlCatalogAddLocal (void *catalogs,
+ const xmlChar *URL);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogLocalResolve (void *catalogs,
+ const xmlChar *pubID,
+ const xmlChar *sysID);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCatalogLocalResolveURI(void *catalogs,
+ const xmlChar *URI);
+/*
+ * Preference settings.
+ */
+XMLPUBFUN int XMLCALL
+ xmlCatalogSetDebug (int level);
+XMLPUBFUN xmlCatalogPrefer XMLCALL
+ xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer);
+XMLPUBFUN void XMLCALL
+ xmlCatalogSetDefaults (xmlCatalogAllow allow);
+XMLPUBFUN xmlCatalogAllow XMLCALL
+ xmlCatalogGetDefaults (void);
+
+
+/* DEPRECATED interfaces */
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlCatalogGetSystem (const xmlChar *sysID);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlCatalogGetPublic (const xmlChar *pubID);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LIBXML_CATALOG_ENABLED */
+#endif /* __XML_CATALOG_H__ */
--- /dev/null
+/*
+ * Summary: Unicode character range checking
+ * Description: this module exports interfaces for the character
+ * range validation APIs
+ *
+ * This file is automatically generated from the cvs source
+ * definition files using the genChRanges.py Python script
+ *
+ * Generation date: Mon Mar 27 11:09:48 2006
+ * Sources: chvalid.def
+ * Author: William Brack <wbrack@mmm.com.hk>
+ */
+
+#ifndef __XML_CHVALID_H__
+#define __XML_CHVALID_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/xmlstring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Define our typedefs and structures
+ *
+ */
+typedef struct _xmlChSRange xmlChSRange;
+typedef xmlChSRange *xmlChSRangePtr;
+struct _xmlChSRange {
+ unsigned short low;
+ unsigned short high;
+};
+
+typedef struct _xmlChLRange xmlChLRange;
+typedef xmlChLRange *xmlChLRangePtr;
+struct _xmlChLRange {
+ unsigned int low;
+ unsigned int high;
+};
+
+typedef struct _xmlChRangeGroup xmlChRangeGroup;
+typedef xmlChRangeGroup *xmlChRangeGroupPtr;
+struct _xmlChRangeGroup {
+ int nbShortRange;
+ int nbLongRange;
+ const xmlChSRange *shortRange; /* points to an array of ranges */
+ const xmlChLRange *longRange;
+};
+
+/**
+ * Range checking routine
+ */
+XMLPUBFUN int XMLCALL
+ xmlCharInRange(unsigned int val, const xmlChRangeGroup *group);
+
+
+/**
+ * xmlIsBaseChar_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsBaseChar_ch(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \
+ ((0x61 <= (c)) && ((c) <= 0x7a)) || \
+ ((0xc0 <= (c)) && ((c) <= 0xd6)) || \
+ ((0xd8 <= (c)) && ((c) <= 0xf6)) || \
+ (0xf8 <= (c)))
+
+/**
+ * xmlIsBaseCharQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsBaseCharQ(c) (((c) < 0x100) ? \
+ xmlIsBaseChar_ch((c)) : \
+ xmlCharInRange((c), &xmlIsBaseCharGroup))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsBaseCharGroup;
+
+/**
+ * xmlIsBlank_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsBlank_ch(c) (((c) == 0x20) || \
+ ((0x9 <= (c)) && ((c) <= 0xa)) || \
+ ((c) == 0xd))
+
+/**
+ * xmlIsBlankQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsBlankQ(c) (((c) < 0x100) ? \
+ xmlIsBlank_ch((c)) : 0)
+
+
+/**
+ * xmlIsChar_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \
+ ((c) == 0xd) || \
+ (0x20 <= (c)))
+
+/**
+ * xmlIsCharQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsCharQ(c) (((c) < 0x100) ? \
+ xmlIsChar_ch((c)) :\
+ (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \
+ ((0xe000 <= (c)) && ((c) <= 0xfffd)) || \
+ ((0x10000 <= (c)) && ((c) <= 0x10ffff))))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsCharGroup;
+
+/**
+ * xmlIsCombiningQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsCombiningQ(c) (((c) < 0x100) ? \
+ 0 : \
+ xmlCharInRange((c), &xmlIsCombiningGroup))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsCombiningGroup;
+
+/**
+ * xmlIsDigit_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsDigit_ch(c) (((0x30 <= (c)) && ((c) <= 0x39)))
+
+/**
+ * xmlIsDigitQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsDigitQ(c) (((c) < 0x100) ? \
+ xmlIsDigit_ch((c)) : \
+ xmlCharInRange((c), &xmlIsDigitGroup))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsDigitGroup;
+
+/**
+ * xmlIsExtender_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsExtender_ch(c) (((c) == 0xb7))
+
+/**
+ * xmlIsExtenderQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsExtenderQ(c) (((c) < 0x100) ? \
+ xmlIsExtender_ch((c)) : \
+ xmlCharInRange((c), &xmlIsExtenderGroup))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsExtenderGroup;
+
+/**
+ * xmlIsIdeographicQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsIdeographicQ(c) (((c) < 0x100) ? \
+ 0 :\
+ (((0x4e00 <= (c)) && ((c) <= 0x9fa5)) || \
+ ((c) == 0x3007) || \
+ ((0x3021 <= (c)) && ((c) <= 0x3029))))
+
+XMLPUBVAR const xmlChRangeGroup xmlIsIdeographicGroup;
+XMLPUBVAR const unsigned char xmlIsPubidChar_tab[256];
+
+/**
+ * xmlIsPubidChar_ch:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsPubidChar_ch(c) (xmlIsPubidChar_tab[(c)])
+
+/**
+ * xmlIsPubidCharQ:
+ * @c: char to validate
+ *
+ * Automatically generated by genChRanges.py
+ */
+#define xmlIsPubidCharQ(c) (((c) < 0x100) ? \
+ xmlIsPubidChar_ch((c)) : 0)
+
+XMLPUBFUN int XMLCALL
+ xmlIsBaseChar(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsBlank(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsChar(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsCombining(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsDigit(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsExtender(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsIdeographic(unsigned int ch);
+XMLPUBFUN int XMLCALL
+ xmlIsPubidChar(unsigned int ch);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_CHVALID_H__ */
--- /dev/null
+/*
+ * Summary: Tree debugging APIs
+ * Description: Interfaces to a set of routines used for debugging the tree
+ * produced by the XML parser.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __DEBUG_XML__
+#define __DEBUG_XML__
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef LIBXML_DEBUG_ENABLED
+
+#include <libxml/xpath.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The standard Dump routines.
+ */
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpString (FILE *output,
+ const xmlChar *str);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpAttr (FILE *output,
+ xmlAttrPtr attr,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpAttrList (FILE *output,
+ xmlAttrPtr attr,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpOneNode (FILE *output,
+ xmlNodePtr node,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpNode (FILE *output,
+ xmlNodePtr node,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpNodeList (FILE *output,
+ xmlNodePtr node,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpDocumentHead(FILE *output,
+ xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpDocument (FILE *output,
+ xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpDTD (FILE *output,
+ xmlDtdPtr dtd);
+XMLPUBFUN void XMLCALL
+ xmlDebugDumpEntities (FILE *output,
+ xmlDocPtr doc);
+
+/****************************************************************
+ * *
+ * Checking routines *
+ * *
+ ****************************************************************/
+
+XMLPUBFUN int XMLCALL
+ xmlDebugCheckDocument (FILE * output,
+ xmlDocPtr doc);
+
+/****************************************************************
+ * *
+ * XML shell helpers *
+ * *
+ ****************************************************************/
+
+XMLPUBFUN void XMLCALL
+ xmlLsOneNode (FILE *output, xmlNodePtr node);
+XMLPUBFUN int XMLCALL
+ xmlLsCountNode (xmlNodePtr node);
+
+XMLPUBFUN const char * XMLCALL
+ xmlBoolToText (int boolval);
+
+/****************************************************************
+ * *
+ * The XML shell related structures and functions *
+ * *
+ ****************************************************************/
+
+#ifdef LIBXML_XPATH_ENABLED
+/**
+ * xmlShellReadlineFunc:
+ * @prompt: a string prompt
+ *
+ * This is a generic signature for the XML shell input function.
+ *
+ * Returns a string which will be freed by the Shell.
+ */
+typedef char * (* xmlShellReadlineFunc)(char *prompt);
+
+/**
+ * xmlShellCtxt:
+ *
+ * A debugging shell context.
+ * TODO: add the defined function tables.
+ */
+typedef struct _xmlShellCtxt xmlShellCtxt;
+typedef xmlShellCtxt *xmlShellCtxtPtr;
+struct _xmlShellCtxt {
+ char *filename;
+ xmlDocPtr doc;
+ xmlNodePtr node;
+ xmlXPathContextPtr pctxt;
+ int loaded;
+ FILE *output;
+ xmlShellReadlineFunc input;
+};
+
+/**
+ * xmlShellCmd:
+ * @ctxt: a shell context
+ * @arg: a string argument
+ * @node: a first node
+ * @node2: a second node
+ *
+ * This is a generic signature for the XML shell functions.
+ *
+ * Returns an int, negative returns indicating errors.
+ */
+typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+
+XMLPUBFUN void XMLCALL
+ xmlShellPrintXPathError (int errorType,
+ const char *arg);
+XMLPUBFUN void XMLCALL
+ xmlShellPrintXPathResult(xmlXPathObjectPtr list);
+XMLPUBFUN int XMLCALL
+ xmlShellList (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellBase (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellDir (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellLoad (xmlShellCtxtPtr ctxt,
+ char *filename,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlShellPrintNode (xmlNodePtr node);
+XMLPUBFUN int XMLCALL
+ xmlShellCat (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellWrite (xmlShellCtxtPtr ctxt,
+ char *filename,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellSave (xmlShellCtxtPtr ctxt,
+ char *filename,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+#endif /* LIBXML_OUTPUT_ENABLED */
+#ifdef LIBXML_VALID_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlShellValidate (xmlShellCtxtPtr ctxt,
+ char *dtd,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+#endif /* LIBXML_VALID_ENABLED */
+XMLPUBFUN int XMLCALL
+ xmlShellDu (xmlShellCtxtPtr ctxt,
+ char *arg,
+ xmlNodePtr tree,
+ xmlNodePtr node2);
+XMLPUBFUN int XMLCALL
+ xmlShellPwd (xmlShellCtxtPtr ctxt,
+ char *buffer,
+ xmlNodePtr node,
+ xmlNodePtr node2);
+
+/*
+ * The Shell interface.
+ */
+XMLPUBFUN void XMLCALL
+ xmlShell (xmlDocPtr doc,
+ char *filename,
+ xmlShellReadlineFunc input,
+ FILE *output);
+
+#endif /* LIBXML_XPATH_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_DEBUG_ENABLED */
+#endif /* __DEBUG_XML__ */
--- /dev/null
+/*
+ * Summary: string dictionnary
+ * Description: dictionary of reusable strings, just used to avoid allocation
+ * and freeing operations.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_DICT_H__
+#define __XML_DICT_H__
+
+#include <limits.h>
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The dictionnary.
+ */
+typedef struct _xmlDict xmlDict;
+typedef xmlDict *xmlDictPtr;
+
+/*
+ * Initializer
+ */
+XMLPUBFUN int XMLCALL xmlInitializeDict(void);
+
+/*
+ * Constructor and destructor.
+ */
+XMLPUBFUN xmlDictPtr XMLCALL
+ xmlDictCreate (void);
+XMLPUBFUN size_t XMLCALL
+ xmlDictSetLimit (xmlDictPtr dict,
+ size_t limit);
+XMLPUBFUN size_t XMLCALL
+ xmlDictGetUsage (xmlDictPtr dict);
+XMLPUBFUN xmlDictPtr XMLCALL
+ xmlDictCreateSub(xmlDictPtr sub);
+XMLPUBFUN int XMLCALL
+ xmlDictReference(xmlDictPtr dict);
+XMLPUBFUN void XMLCALL
+ xmlDictFree (xmlDictPtr dict);
+
+/*
+ * Lookup of entry in the dictionnary.
+ */
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlDictLookup (xmlDictPtr dict,
+ const xmlChar *name,
+ int len);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlDictExists (xmlDictPtr dict,
+ const xmlChar *name,
+ int len);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlDictQLookup (xmlDictPtr dict,
+ const xmlChar *prefix,
+ const xmlChar *name);
+XMLPUBFUN int XMLCALL
+ xmlDictOwns (xmlDictPtr dict,
+ const xmlChar *str);
+XMLPUBFUN int XMLCALL
+ xmlDictSize (xmlDictPtr dict);
+
+/*
+ * Cleanup function
+ */
+XMLPUBFUN void XMLCALL
+ xmlDictCleanup (void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* ! __XML_DICT_H__ */
--- /dev/null
+/*
+ * Summary: interface for the encoding conversion functions
+ * Description: interface for the encoding conversion functions needed for
+ * XML basic encoding and iconv() support.
+ *
+ * Related specs are
+ * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies
+ * [ISO-10646] UTF-8 and UTF-16 in Annexes
+ * [ISO-8859-1] ISO Latin-1 characters codes.
+ * [UNICODE] The Unicode Consortium, "The Unicode Standard --
+ * Worldwide Character Encoding -- Version 1.0", Addison-
+ * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is
+ * described in Unicode Technical Report #4.
+ * [US-ASCII] Coded Character Set--7-bit American Standard Code for
+ * Information Interchange, ANSI X3.4-1986.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_CHAR_ENCODING_H__
+#define __XML_CHAR_ENCODING_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_ICONV_ENABLED
+#include <iconv.h>
+#endif
+#ifdef LIBXML_ICU_ENABLED
+#include <unicode/ucnv.h>
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * xmlCharEncoding:
+ *
+ * Predefined values for some standard encodings.
+ * Libxml does not do beforehand translation on UTF8 and ISOLatinX.
+ * It also supports ASCII, ISO-8859-1, and UTF16 (LE and BE) by default.
+ *
+ * Anything else would have to be translated to UTF8 before being
+ * given to the parser itself. The BOM for UTF16 and the encoding
+ * declaration are looked at and a converter is looked for at that
+ * point. If not found the parser stops here as asked by the XML REC. A
+ * converter can be registered by the user using xmlRegisterCharEncodingHandler
+ * but the current form doesn't allow stateful transcoding (a serious
+ * problem agreed !). If iconv has been found it will be used
+ * automatically and allow stateful transcoding, the simplest is then
+ * to be sure to enable iconv and to provide iconv libs for the encoding
+ * support needed.
+ *
+ * Note that the generic "UTF-16" is not a predefined value. Instead, only
+ * the specific UTF-16LE and UTF-16BE are present.
+ */
+typedef enum {
+ XML_CHAR_ENCODING_ERROR= -1, /* No char encoding detected */
+ XML_CHAR_ENCODING_NONE= 0, /* No char encoding detected */
+ XML_CHAR_ENCODING_UTF8= 1, /* UTF-8 */
+ XML_CHAR_ENCODING_UTF16LE= 2, /* UTF-16 little endian */
+ XML_CHAR_ENCODING_UTF16BE= 3, /* UTF-16 big endian */
+ XML_CHAR_ENCODING_UCS4LE= 4, /* UCS-4 little endian */
+ XML_CHAR_ENCODING_UCS4BE= 5, /* UCS-4 big endian */
+ XML_CHAR_ENCODING_EBCDIC= 6, /* EBCDIC uh! */
+ XML_CHAR_ENCODING_UCS4_2143=7, /* UCS-4 unusual ordering */
+ XML_CHAR_ENCODING_UCS4_3412=8, /* UCS-4 unusual ordering */
+ XML_CHAR_ENCODING_UCS2= 9, /* UCS-2 */
+ XML_CHAR_ENCODING_8859_1= 10,/* ISO-8859-1 ISO Latin 1 */
+ XML_CHAR_ENCODING_8859_2= 11,/* ISO-8859-2 ISO Latin 2 */
+ XML_CHAR_ENCODING_8859_3= 12,/* ISO-8859-3 */
+ XML_CHAR_ENCODING_8859_4= 13,/* ISO-8859-4 */
+ XML_CHAR_ENCODING_8859_5= 14,/* ISO-8859-5 */
+ XML_CHAR_ENCODING_8859_6= 15,/* ISO-8859-6 */
+ XML_CHAR_ENCODING_8859_7= 16,/* ISO-8859-7 */
+ XML_CHAR_ENCODING_8859_8= 17,/* ISO-8859-8 */
+ XML_CHAR_ENCODING_8859_9= 18,/* ISO-8859-9 */
+ XML_CHAR_ENCODING_2022_JP= 19,/* ISO-2022-JP */
+ XML_CHAR_ENCODING_SHIFT_JIS=20,/* Shift_JIS */
+ XML_CHAR_ENCODING_EUC_JP= 21,/* EUC-JP */
+ XML_CHAR_ENCODING_ASCII= 22 /* pure ASCII */
+} xmlCharEncoding;
+
+/**
+ * xmlCharEncodingInputFunc:
+ * @out: a pointer to an array of bytes to store the UTF-8 result
+ * @outlen: the length of @out
+ * @in: a pointer to an array of chars in the original encoding
+ * @inlen: the length of @in
+ *
+ * Take a block of chars in the original encoding and try to convert
+ * it to an UTF-8 block of chars out.
+ *
+ * Returns the number of bytes written, -1 if lack of space, or -2
+ * if the transcoding failed.
+ * The value of @inlen after return is the number of octets consumed
+ * if the return value is positive, else unpredictiable.
+ * The value of @outlen after return is the number of octets consumed.
+ */
+typedef int (* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen,
+ const unsigned char *in, int *inlen);
+
+
+/**
+ * xmlCharEncodingOutputFunc:
+ * @out: a pointer to an array of bytes to store the result
+ * @outlen: the length of @out
+ * @in: a pointer to an array of UTF-8 chars
+ * @inlen: the length of @in
+ *
+ * Take a block of UTF-8 chars in and try to convert it to another
+ * encoding.
+ * Note: a first call designed to produce heading info is called with
+ * in = NULL. If stateful this should also initialize the encoder state.
+ *
+ * Returns the number of bytes written, -1 if lack of space, or -2
+ * if the transcoding failed.
+ * The value of @inlen after return is the number of octets consumed
+ * if the return value is positive, else unpredictiable.
+ * The value of @outlen after return is the number of octets produced.
+ */
+typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen,
+ const unsigned char *in, int *inlen);
+
+
+/*
+ * Block defining the handlers for non UTF-8 encodings.
+ * If iconv is supported, there are two extra fields.
+ */
+#ifdef LIBXML_ICU_ENABLED
+struct _uconv_t {
+ UConverter *uconv; /* for conversion between an encoding and UTF-16 */
+ UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */
+};
+typedef struct _uconv_t uconv_t;
+#endif
+
+typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler;
+typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr;
+struct _xmlCharEncodingHandler {
+ char *name;
+ xmlCharEncodingInputFunc input;
+ xmlCharEncodingOutputFunc output;
+#ifdef LIBXML_ICONV_ENABLED
+ iconv_t iconv_in;
+ iconv_t iconv_out;
+#endif /* LIBXML_ICONV_ENABLED */
+#ifdef LIBXML_ICU_ENABLED
+ uconv_t *uconv_in;
+ uconv_t *uconv_out;
+#endif /* LIBXML_ICU_ENABLED */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/tree.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Interfaces for encoding handlers.
+ */
+XMLPUBFUN void XMLCALL
+ xmlInitCharEncodingHandlers (void);
+XMLPUBFUN void XMLCALL
+ xmlCleanupCharEncodingHandlers (void);
+XMLPUBFUN void XMLCALL
+ xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler);
+XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL
+ xmlGetCharEncodingHandler (xmlCharEncoding enc);
+XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL
+ xmlFindCharEncodingHandler (const char *name);
+XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL
+ xmlNewCharEncodingHandler (const char *name,
+ xmlCharEncodingInputFunc input,
+ xmlCharEncodingOutputFunc output);
+
+/*
+ * Interfaces for encoding names and aliases.
+ */
+XMLPUBFUN int XMLCALL
+ xmlAddEncodingAlias (const char *name,
+ const char *alias);
+XMLPUBFUN int XMLCALL
+ xmlDelEncodingAlias (const char *alias);
+XMLPUBFUN const char * XMLCALL
+ xmlGetEncodingAlias (const char *alias);
+XMLPUBFUN void XMLCALL
+ xmlCleanupEncodingAliases (void);
+XMLPUBFUN xmlCharEncoding XMLCALL
+ xmlParseCharEncoding (const char *name);
+XMLPUBFUN const char * XMLCALL
+ xmlGetCharEncodingName (xmlCharEncoding enc);
+
+/*
+ * Interfaces directly used by the parsers.
+ */
+XMLPUBFUN xmlCharEncoding XMLCALL
+ xmlDetectCharEncoding (const unsigned char *in,
+ int len);
+
+XMLPUBFUN int XMLCALL
+ xmlCharEncOutFunc (xmlCharEncodingHandler *handler,
+ xmlBufferPtr out,
+ xmlBufferPtr in);
+
+XMLPUBFUN int XMLCALL
+ xmlCharEncInFunc (xmlCharEncodingHandler *handler,
+ xmlBufferPtr out,
+ xmlBufferPtr in);
+XMLPUBFUN int XMLCALL
+ xmlCharEncFirstLine (xmlCharEncodingHandler *handler,
+ xmlBufferPtr out,
+ xmlBufferPtr in);
+XMLPUBFUN int XMLCALL
+ xmlCharEncCloseFunc (xmlCharEncodingHandler *handler);
+
+/*
+ * Export a few useful functions
+ */
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN int XMLCALL
+ UTF8Toisolat1 (unsigned char *out,
+ int *outlen,
+ const unsigned char *in,
+ int *inlen);
+#endif /* LIBXML_OUTPUT_ENABLED */
+XMLPUBFUN int XMLCALL
+ isolat1ToUTF8 (unsigned char *out,
+ int *outlen,
+ const unsigned char *in,
+ int *inlen);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_CHAR_ENCODING_H__ */
--- /dev/null
+/*
+ * Summary: interface for the XML entities handling
+ * Description: this module provides some of the entity API needed
+ * for the parser and applications.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_ENTITIES_H__
+#define __XML_ENTITIES_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The different valid entity types.
+ */
+typedef enum {
+ XML_INTERNAL_GENERAL_ENTITY = 1,
+ XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2,
+ XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3,
+ XML_INTERNAL_PARAMETER_ENTITY = 4,
+ XML_EXTERNAL_PARAMETER_ENTITY = 5,
+ XML_INTERNAL_PREDEFINED_ENTITY = 6
+} xmlEntityType;
+
+/*
+ * An unit of storage for an entity, contains the string, the value
+ * and the linkind data needed for the linking in the hash table.
+ */
+
+struct _xmlEntity {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_ENTITY_DECL, must be second ! */
+ const xmlChar *name; /* Entity name */
+ struct _xmlNode *children; /* First child link */
+ struct _xmlNode *last; /* Last child link */
+ struct _xmlDtd *parent; /* -> DTD */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+
+ xmlChar *orig; /* content without ref substitution */
+ xmlChar *content; /* content or ndata if unparsed */
+ int length; /* the content length */
+ xmlEntityType etype; /* The entity type */
+ const xmlChar *ExternalID; /* External identifier for PUBLIC */
+ const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC Entity */
+
+ struct _xmlEntity *nexte; /* unused */
+ const xmlChar *URI; /* the full URI as computed */
+ int owner; /* does the entity own the childrens */
+ int checked; /* was the entity content checked */
+ /* this is also used to count entites
+ * references done from that entity
+ * and if it contains '<' */
+};
+
+/*
+ * All entities are stored in an hash table.
+ * There is 2 separate hash tables for global and parameter entities.
+ */
+
+typedef struct _xmlHashTable xmlEntitiesTable;
+typedef xmlEntitiesTable *xmlEntitiesTablePtr;
+
+/*
+ * External functions:
+ */
+
+#ifdef LIBXML_LEGACY_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlInitializePredefinedEntities (void);
+#endif /* LIBXML_LEGACY_ENABLED */
+
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlNewEntity (xmlDocPtr doc,
+ const xmlChar *name,
+ int type,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID,
+ const xmlChar *content);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlAddDocEntity (xmlDocPtr doc,
+ const xmlChar *name,
+ int type,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID,
+ const xmlChar *content);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlAddDtdEntity (xmlDocPtr doc,
+ const xmlChar *name,
+ int type,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID,
+ const xmlChar *content);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlGetPredefinedEntity (const xmlChar *name);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlGetDocEntity (xmlDocPtr doc,
+ const xmlChar *name);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlGetDtdEntity (xmlDocPtr doc,
+ const xmlChar *name);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlGetParameterEntity (xmlDocPtr doc,
+ const xmlChar *name);
+#ifdef LIBXML_LEGACY_ENABLED
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlEncodeEntities (xmlDocPtr doc,
+ const xmlChar *input);
+#endif /* LIBXML_LEGACY_ENABLED */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlEncodeEntitiesReentrant(xmlDocPtr doc,
+ const xmlChar *input);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlEncodeSpecialChars (xmlDocPtr doc,
+ const xmlChar *input);
+XMLPUBFUN xmlEntitiesTablePtr XMLCALL
+ xmlCreateEntitiesTable (void);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlEntitiesTablePtr XMLCALL
+ xmlCopyEntitiesTable (xmlEntitiesTablePtr table);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlFreeEntitiesTable (xmlEntitiesTablePtr table);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlDumpEntitiesTable (xmlBufferPtr buf,
+ xmlEntitiesTablePtr table);
+XMLPUBFUN void XMLCALL
+ xmlDumpEntityDecl (xmlBufferPtr buf,
+ xmlEntityPtr ent);
+#endif /* LIBXML_OUTPUT_ENABLED */
+#ifdef LIBXML_LEGACY_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlCleanupPredefinedEntities(void);
+#endif /* LIBXML_LEGACY_ENABLED */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+# endif /* __XML_ENTITIES_H__ */
--- /dev/null
+/*
+ * Summary: interface for all global variables of the library
+ * Description: all the global variables and thread handling for
+ * those variables is handled by this module.
+ *
+ * The bottom of this file is automatically generated by build_glob.py
+ * based on the description file global.data
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Gary Pennington <Gary.Pennington@uk.sun.com>, Daniel Veillard
+ */
+
+#ifndef __XML_GLOBALS_H
+#define __XML_GLOBALS_H
+
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/xmlerror.h>
+#include <libxml/SAX.h>
+#include <libxml/SAX2.h>
+#include <libxml/xmlmemory.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+XMLPUBFUN void XMLCALL xmlInitGlobals(void);
+XMLPUBFUN void XMLCALL xmlCleanupGlobals(void);
+
+/**
+ * xmlParserInputBufferCreateFilenameFunc:
+ * @URI: the URI to read from
+ * @enc: the requested source encoding
+ *
+ * Signature for the function doing the lookup for a suitable input method
+ * corresponding to an URI.
+ *
+ * Returns the new xmlParserInputBufferPtr in case of success or NULL if no
+ * method was found.
+ */
+typedef xmlParserInputBufferPtr (*xmlParserInputBufferCreateFilenameFunc) (const char *URI, xmlCharEncoding enc);
+
+/**
+ * xmlOutputBufferCreateFilenameFunc:
+ * @URI: the URI to write to
+ * @enc: the requested target encoding
+ *
+ * Signature for the function doing the lookup for a suitable output method
+ * corresponding to an URI.
+ *
+ * Returns the new xmlOutputBufferPtr in case of success or NULL if no
+ * method was found.
+ */
+typedef xmlOutputBufferPtr (*xmlOutputBufferCreateFilenameFunc) (const char *URI, xmlCharEncodingHandlerPtr encoder, int compression);
+
+XMLPUBFUN xmlParserInputBufferCreateFilenameFunc
+XMLCALL xmlParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func);
+XMLPUBFUN xmlOutputBufferCreateFilenameFunc
+XMLCALL xmlOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func);
+
+/*
+ * Externally global symbols which need to be protected for backwards
+ * compatibility support.
+ */
+
+#undef docbDefaultSAXHandler
+#undef htmlDefaultSAXHandler
+#undef oldXMLWDcompatibility
+#undef xmlBufferAllocScheme
+#undef xmlDefaultBufferSize
+#undef xmlDefaultSAXHandler
+#undef xmlDefaultSAXLocator
+#undef xmlDoValidityCheckingDefaultValue
+#undef xmlFree
+#undef xmlGenericError
+#undef xmlStructuredError
+#undef xmlGenericErrorContext
+#undef xmlStructuredErrorContext
+#undef xmlGetWarningsDefaultValue
+#undef xmlIndentTreeOutput
+#undef xmlTreeIndentString
+#undef xmlKeepBlanksDefaultValue
+#undef xmlLineNumbersDefaultValue
+#undef xmlLoadExtDtdDefaultValue
+#undef xmlMalloc
+#undef xmlMallocAtomic
+#undef xmlMemStrdup
+#undef xmlParserDebugEntities
+#undef xmlParserVersion
+#undef xmlPedanticParserDefaultValue
+#undef xmlRealloc
+#undef xmlSaveNoEmptyTags
+#undef xmlSubstituteEntitiesDefaultValue
+#undef xmlRegisterNodeDefaultValue
+#undef xmlDeregisterNodeDefaultValue
+#undef xmlLastError
+#undef xmlParserInputBufferCreateFilenameValue
+#undef xmlOutputBufferCreateFilenameValue
+
+/**
+ * xmlRegisterNodeFunc:
+ * @node: the current node
+ *
+ * Signature for the registration callback of a created node
+ */
+typedef void (*xmlRegisterNodeFunc) (xmlNodePtr node);
+/**
+ * xmlDeregisterNodeFunc:
+ * @node: the current node
+ *
+ * Signature for the deregistration callback of a discarded node
+ */
+typedef void (*xmlDeregisterNodeFunc) (xmlNodePtr node);
+
+typedef struct _xmlGlobalState xmlGlobalState;
+typedef xmlGlobalState *xmlGlobalStatePtr;
+struct _xmlGlobalState
+{
+ const char *xmlParserVersion;
+
+ xmlSAXLocator xmlDefaultSAXLocator;
+ xmlSAXHandlerV1 xmlDefaultSAXHandler;
+ xmlSAXHandlerV1 docbDefaultSAXHandler;
+ xmlSAXHandlerV1 htmlDefaultSAXHandler;
+
+ xmlFreeFunc xmlFree;
+ xmlMallocFunc xmlMalloc;
+ xmlStrdupFunc xmlMemStrdup;
+ xmlReallocFunc xmlRealloc;
+
+ xmlGenericErrorFunc xmlGenericError;
+ xmlStructuredErrorFunc xmlStructuredError;
+ void *xmlGenericErrorContext;
+
+ int oldXMLWDcompatibility;
+
+ xmlBufferAllocationScheme xmlBufferAllocScheme;
+ int xmlDefaultBufferSize;
+
+ int xmlSubstituteEntitiesDefaultValue;
+ int xmlDoValidityCheckingDefaultValue;
+ int xmlGetWarningsDefaultValue;
+ int xmlKeepBlanksDefaultValue;
+ int xmlLineNumbersDefaultValue;
+ int xmlLoadExtDtdDefaultValue;
+ int xmlParserDebugEntities;
+ int xmlPedanticParserDefaultValue;
+
+ int xmlSaveNoEmptyTags;
+ int xmlIndentTreeOutput;
+ const char *xmlTreeIndentString;
+
+ xmlRegisterNodeFunc xmlRegisterNodeDefaultValue;
+ xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue;
+
+ xmlMallocFunc xmlMallocAtomic;
+ xmlError xmlLastError;
+
+ xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue;
+ xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue;
+
+ void *xmlStructuredErrorContext;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/threads.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+XMLPUBFUN void XMLCALL xmlInitializeGlobalState(xmlGlobalStatePtr gs);
+
+XMLPUBFUN void XMLCALL xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler);
+
+XMLPUBFUN void XMLCALL xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler);
+
+XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlRegisterNodeDefault(xmlRegisterNodeFunc func);
+XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func);
+XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func);
+XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func);
+
+XMLPUBFUN xmlOutputBufferCreateFilenameFunc XMLCALL
+ xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func);
+XMLPUBFUN xmlParserInputBufferCreateFilenameFunc XMLCALL
+ xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func);
+
+/** DOC_DISABLE */
+/*
+ * In general the memory allocation entry points are not kept
+ * thread specific but this can be overridden by LIBXML_THREAD_ALLOC_ENABLED
+ * - xmlMalloc
+ * - xmlMallocAtomic
+ * - xmlRealloc
+ * - xmlMemStrdup
+ * - xmlFree
+ */
+
+#ifdef LIBXML_THREAD_ALLOC_ENABLED
+#ifdef LIBXML_THREAD_ENABLED
+XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMalloc(void);
+#define xmlMalloc \
+(*(__xmlMalloc()))
+#else
+XMLPUBVAR xmlMallocFunc xmlMalloc;
+#endif
+
+#ifdef LIBXML_THREAD_ENABLED
+XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMallocAtomic(void);
+#define xmlMallocAtomic \
+(*(__xmlMallocAtomic()))
+#else
+XMLPUBVAR xmlMallocFunc xmlMallocAtomic;
+#endif
+
+#ifdef LIBXML_THREAD_ENABLED
+XMLPUBFUN xmlReallocFunc * XMLCALL __xmlRealloc(void);
+#define xmlRealloc \
+(*(__xmlRealloc()))
+#else
+XMLPUBVAR xmlReallocFunc xmlRealloc;
+#endif
+
+#ifdef LIBXML_THREAD_ENABLED
+XMLPUBFUN xmlFreeFunc * XMLCALL __xmlFree(void);
+#define xmlFree \
+(*(__xmlFree()))
+#else
+XMLPUBVAR xmlFreeFunc xmlFree;
+#endif
+
+#ifdef LIBXML_THREAD_ENABLED
+XMLPUBFUN xmlStrdupFunc * XMLCALL __xmlMemStrdup(void);
+#define xmlMemStrdup \
+(*(__xmlMemStrdup()))
+#else
+XMLPUBVAR xmlStrdupFunc xmlMemStrdup;
+#endif
+
+#else /* !LIBXML_THREAD_ALLOC_ENABLED */
+XMLPUBVAR xmlMallocFunc xmlMalloc;
+XMLPUBVAR xmlMallocFunc xmlMallocAtomic;
+XMLPUBVAR xmlReallocFunc xmlRealloc;
+XMLPUBVAR xmlFreeFunc xmlFree;
+XMLPUBVAR xmlStrdupFunc xmlMemStrdup;
+#endif /* LIBXML_THREAD_ALLOC_ENABLED */
+
+#ifdef LIBXML_DOCB_ENABLED
+XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __docbDefaultSAXHandler(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define docbDefaultSAXHandler \
+(*(__docbDefaultSAXHandler()))
+#else
+XMLPUBVAR xmlSAXHandlerV1 docbDefaultSAXHandler;
+#endif
+#endif
+
+#ifdef LIBXML_HTML_ENABLED
+XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __htmlDefaultSAXHandler(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define htmlDefaultSAXHandler \
+(*(__htmlDefaultSAXHandler()))
+#else
+XMLPUBVAR xmlSAXHandlerV1 htmlDefaultSAXHandler;
+#endif
+#endif
+
+XMLPUBFUN xmlError * XMLCALL __xmlLastError(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlLastError \
+(*(__xmlLastError()))
+#else
+XMLPUBVAR xmlError xmlLastError;
+#endif
+
+/*
+ * Everything starting from the line below is
+ * Automatically generated by build_glob.py.
+ * Do not modify the previous line.
+ */
+
+
+XMLPUBFUN int * XMLCALL __oldXMLWDcompatibility(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define oldXMLWDcompatibility \
+(*(__oldXMLWDcompatibility()))
+#else
+XMLPUBVAR int oldXMLWDcompatibility;
+#endif
+
+XMLPUBFUN xmlBufferAllocationScheme * XMLCALL __xmlBufferAllocScheme(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlBufferAllocScheme \
+(*(__xmlBufferAllocScheme()))
+#else
+XMLPUBVAR xmlBufferAllocationScheme xmlBufferAllocScheme;
+#endif
+XMLPUBFUN xmlBufferAllocationScheme XMLCALL xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v);
+
+XMLPUBFUN int * XMLCALL __xmlDefaultBufferSize(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlDefaultBufferSize \
+(*(__xmlDefaultBufferSize()))
+#else
+XMLPUBVAR int xmlDefaultBufferSize;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefDefaultBufferSize(int v);
+
+XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __xmlDefaultSAXHandler(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlDefaultSAXHandler \
+(*(__xmlDefaultSAXHandler()))
+#else
+XMLPUBVAR xmlSAXHandlerV1 xmlDefaultSAXHandler;
+#endif
+
+XMLPUBFUN xmlSAXLocator * XMLCALL __xmlDefaultSAXLocator(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlDefaultSAXLocator \
+(*(__xmlDefaultSAXLocator()))
+#else
+XMLPUBVAR xmlSAXLocator xmlDefaultSAXLocator;
+#endif
+
+XMLPUBFUN int * XMLCALL __xmlDoValidityCheckingDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlDoValidityCheckingDefaultValue \
+(*(__xmlDoValidityCheckingDefaultValue()))
+#else
+XMLPUBVAR int xmlDoValidityCheckingDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefDoValidityCheckingDefaultValue(int v);
+
+XMLPUBFUN xmlGenericErrorFunc * XMLCALL __xmlGenericError(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlGenericError \
+(*(__xmlGenericError()))
+#else
+XMLPUBVAR xmlGenericErrorFunc xmlGenericError;
+#endif
+
+XMLPUBFUN xmlStructuredErrorFunc * XMLCALL __xmlStructuredError(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlStructuredError \
+(*(__xmlStructuredError()))
+#else
+XMLPUBVAR xmlStructuredErrorFunc xmlStructuredError;
+#endif
+
+XMLPUBFUN void * * XMLCALL __xmlGenericErrorContext(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlGenericErrorContext \
+(*(__xmlGenericErrorContext()))
+#else
+XMLPUBVAR void * xmlGenericErrorContext;
+#endif
+
+XMLPUBFUN void * * XMLCALL __xmlStructuredErrorContext(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlStructuredErrorContext \
+(*(__xmlStructuredErrorContext()))
+#else
+XMLPUBVAR void * xmlStructuredErrorContext;
+#endif
+
+XMLPUBFUN int * XMLCALL __xmlGetWarningsDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlGetWarningsDefaultValue \
+(*(__xmlGetWarningsDefaultValue()))
+#else
+XMLPUBVAR int xmlGetWarningsDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefGetWarningsDefaultValue(int v);
+
+XMLPUBFUN int * XMLCALL __xmlIndentTreeOutput(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlIndentTreeOutput \
+(*(__xmlIndentTreeOutput()))
+#else
+XMLPUBVAR int xmlIndentTreeOutput;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefIndentTreeOutput(int v);
+
+XMLPUBFUN const char * * XMLCALL __xmlTreeIndentString(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlTreeIndentString \
+(*(__xmlTreeIndentString()))
+#else
+XMLPUBVAR const char * xmlTreeIndentString;
+#endif
+XMLPUBFUN const char * XMLCALL xmlThrDefTreeIndentString(const char * v);
+
+XMLPUBFUN int * XMLCALL __xmlKeepBlanksDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlKeepBlanksDefaultValue \
+(*(__xmlKeepBlanksDefaultValue()))
+#else
+XMLPUBVAR int xmlKeepBlanksDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefKeepBlanksDefaultValue(int v);
+
+XMLPUBFUN int * XMLCALL __xmlLineNumbersDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlLineNumbersDefaultValue \
+(*(__xmlLineNumbersDefaultValue()))
+#else
+XMLPUBVAR int xmlLineNumbersDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefLineNumbersDefaultValue(int v);
+
+XMLPUBFUN int * XMLCALL __xmlLoadExtDtdDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlLoadExtDtdDefaultValue \
+(*(__xmlLoadExtDtdDefaultValue()))
+#else
+XMLPUBVAR int xmlLoadExtDtdDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefLoadExtDtdDefaultValue(int v);
+
+XMLPUBFUN int * XMLCALL __xmlParserDebugEntities(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlParserDebugEntities \
+(*(__xmlParserDebugEntities()))
+#else
+XMLPUBVAR int xmlParserDebugEntities;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefParserDebugEntities(int v);
+
+XMLPUBFUN const char * * XMLCALL __xmlParserVersion(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlParserVersion \
+(*(__xmlParserVersion()))
+#else
+XMLPUBVAR const char * xmlParserVersion;
+#endif
+
+XMLPUBFUN int * XMLCALL __xmlPedanticParserDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlPedanticParserDefaultValue \
+(*(__xmlPedanticParserDefaultValue()))
+#else
+XMLPUBVAR int xmlPedanticParserDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefPedanticParserDefaultValue(int v);
+
+XMLPUBFUN int * XMLCALL __xmlSaveNoEmptyTags(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlSaveNoEmptyTags \
+(*(__xmlSaveNoEmptyTags()))
+#else
+XMLPUBVAR int xmlSaveNoEmptyTags;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefSaveNoEmptyTags(int v);
+
+XMLPUBFUN int * XMLCALL __xmlSubstituteEntitiesDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlSubstituteEntitiesDefaultValue \
+(*(__xmlSubstituteEntitiesDefaultValue()))
+#else
+XMLPUBVAR int xmlSubstituteEntitiesDefaultValue;
+#endif
+XMLPUBFUN int XMLCALL xmlThrDefSubstituteEntitiesDefaultValue(int v);
+
+XMLPUBFUN xmlRegisterNodeFunc * XMLCALL __xmlRegisterNodeDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlRegisterNodeDefaultValue \
+(*(__xmlRegisterNodeDefaultValue()))
+#else
+XMLPUBVAR xmlRegisterNodeFunc xmlRegisterNodeDefaultValue;
+#endif
+
+XMLPUBFUN xmlDeregisterNodeFunc * XMLCALL __xmlDeregisterNodeDefaultValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlDeregisterNodeDefaultValue \
+(*(__xmlDeregisterNodeDefaultValue()))
+#else
+XMLPUBVAR xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue;
+#endif
+
+XMLPUBFUN xmlParserInputBufferCreateFilenameFunc * XMLCALL __xmlParserInputBufferCreateFilenameValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlParserInputBufferCreateFilenameValue \
+(*(__xmlParserInputBufferCreateFilenameValue()))
+#else
+XMLPUBVAR xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue;
+#endif
+
+XMLPUBFUN xmlOutputBufferCreateFilenameFunc * XMLCALL __xmlOutputBufferCreateFilenameValue(void);
+#ifdef LIBXML_THREAD_ENABLED
+#define xmlOutputBufferCreateFilenameValue \
+(*(__xmlOutputBufferCreateFilenameValue()))
+#else
+XMLPUBVAR xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_GLOBALS_H */
--- /dev/null
+/*
+ * Summary: Chained hash tables
+ * Description: This module implements the hash table support used in
+ * various places in the library.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Bjorn Reese <bjorn.reese@systematic.dk>
+ */
+
+#ifndef __XML_HASH_H__
+#define __XML_HASH_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The hash table.
+ */
+typedef struct _xmlHashTable xmlHashTable;
+typedef xmlHashTable *xmlHashTablePtr;
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/dict.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Recent version of gcc produce a warning when a function pointer is assigned
+ * to an object pointer, or vice versa. The following macro is a dirty hack
+ * to allow suppression of the warning. If your architecture has function
+ * pointers which are a different size than a void pointer, there may be some
+ * serious trouble within the library.
+ */
+/**
+ * XML_CAST_FPTR:
+ * @fptr: pointer to a function
+ *
+ * Macro to do a casting from an object pointer to a
+ * function pointer without encountering a warning from
+ * gcc
+ *
+ * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
+ * This macro violated ISO C aliasing rules (gcc4 on s390 broke)
+ * so it is disabled now
+ */
+
+#define XML_CAST_FPTR(fptr) fptr
+
+
+/*
+ * function types:
+ */
+/**
+ * xmlHashDeallocator:
+ * @payload: the data in the hash
+ * @name: the name associated
+ *
+ * Callback to free data from a hash.
+ */
+typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
+/**
+ * xmlHashCopier:
+ * @payload: the data in the hash
+ * @name: the name associated
+ *
+ * Callback to copy data from a hash.
+ *
+ * Returns a copy of the data or NULL in case of error.
+ */
+typedef void *(*xmlHashCopier)(void *payload, xmlChar *name);
+/**
+ * xmlHashScanner:
+ * @payload: the data in the hash
+ * @data: extra scannner data
+ * @name: the name associated
+ *
+ * Callback when scanning data in a hash with the simple scanner.
+ */
+typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name);
+/**
+ * xmlHashScannerFull:
+ * @payload: the data in the hash
+ * @data: extra scannner data
+ * @name: the name associated
+ * @name2: the second name associated
+ * @name3: the third name associated
+ *
+ * Callback when scanning data in a hash with the full scanner.
+ */
+typedef void (*xmlHashScannerFull)(void *payload, void *data,
+ const xmlChar *name, const xmlChar *name2,
+ const xmlChar *name3);
+
+/*
+ * Constructor and destructor.
+ */
+XMLPUBFUN xmlHashTablePtr XMLCALL
+ xmlHashCreate (int size);
+XMLPUBFUN xmlHashTablePtr XMLCALL
+ xmlHashCreateDict(int size,
+ xmlDictPtr dict);
+XMLPUBFUN void XMLCALL
+ xmlHashFree (xmlHashTablePtr table,
+ xmlHashDeallocator f);
+
+/*
+ * Add a new entry to the hash table.
+ */
+XMLPUBFUN int XMLCALL
+ xmlHashAddEntry (xmlHashTablePtr table,
+ const xmlChar *name,
+ void *userdata);
+XMLPUBFUN int XMLCALL
+ xmlHashUpdateEntry(xmlHashTablePtr table,
+ const xmlChar *name,
+ void *userdata,
+ xmlHashDeallocator f);
+XMLPUBFUN int XMLCALL
+ xmlHashAddEntry2(xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ void *userdata);
+XMLPUBFUN int XMLCALL
+ xmlHashUpdateEntry2(xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ void *userdata,
+ xmlHashDeallocator f);
+XMLPUBFUN int XMLCALL
+ xmlHashAddEntry3(xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ const xmlChar *name3,
+ void *userdata);
+XMLPUBFUN int XMLCALL
+ xmlHashUpdateEntry3(xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ const xmlChar *name3,
+ void *userdata,
+ xmlHashDeallocator f);
+
+/*
+ * Remove an entry from the hash table.
+ */
+XMLPUBFUN int XMLCALL
+ xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
+ xmlHashDeallocator f);
+XMLPUBFUN int XMLCALL
+ xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
+ const xmlChar *name2, xmlHashDeallocator f);
+XMLPUBFUN int XMLCALL
+ xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
+ const xmlChar *name2, const xmlChar *name3,
+ xmlHashDeallocator f);
+
+/*
+ * Retrieve the userdata.
+ */
+XMLPUBFUN void * XMLCALL
+ xmlHashLookup (xmlHashTablePtr table,
+ const xmlChar *name);
+XMLPUBFUN void * XMLCALL
+ xmlHashLookup2 (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2);
+XMLPUBFUN void * XMLCALL
+ xmlHashLookup3 (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ const xmlChar *name3);
+XMLPUBFUN void * XMLCALL
+ xmlHashQLookup (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *prefix);
+XMLPUBFUN void * XMLCALL
+ xmlHashQLookup2 (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *prefix,
+ const xmlChar *name2,
+ const xmlChar *prefix2);
+XMLPUBFUN void * XMLCALL
+ xmlHashQLookup3 (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *prefix,
+ const xmlChar *name2,
+ const xmlChar *prefix2,
+ const xmlChar *name3,
+ const xmlChar *prefix3);
+
+/*
+ * Helpers.
+ */
+XMLPUBFUN xmlHashTablePtr XMLCALL
+ xmlHashCopy (xmlHashTablePtr table,
+ xmlHashCopier f);
+XMLPUBFUN int XMLCALL
+ xmlHashSize (xmlHashTablePtr table);
+XMLPUBFUN void XMLCALL
+ xmlHashScan (xmlHashTablePtr table,
+ xmlHashScanner f,
+ void *data);
+XMLPUBFUN void XMLCALL
+ xmlHashScan3 (xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ const xmlChar *name3,
+ xmlHashScanner f,
+ void *data);
+XMLPUBFUN void XMLCALL
+ xmlHashScanFull (xmlHashTablePtr table,
+ xmlHashScannerFull f,
+ void *data);
+XMLPUBFUN void XMLCALL
+ xmlHashScanFull3(xmlHashTablePtr table,
+ const xmlChar *name,
+ const xmlChar *name2,
+ const xmlChar *name3,
+ xmlHashScannerFull f,
+ void *data);
+#ifdef __cplusplus
+}
+#endif
+#endif /* ! __XML_HASH_H__ */
--- /dev/null
+/*
+ * Summary: lists interfaces
+ * Description: this module implement the list support used in
+ * various place in the library.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Gary Pennington <Gary.Pennington@uk.sun.com>
+ */
+
+#ifndef __XML_LINK_INCLUDE__
+#define __XML_LINK_INCLUDE__
+
+#include <libxml/xmlversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _xmlLink xmlLink;
+typedef xmlLink *xmlLinkPtr;
+
+typedef struct _xmlList xmlList;
+typedef xmlList *xmlListPtr;
+
+/**
+ * xmlListDeallocator:
+ * @lk: the data to deallocate
+ *
+ * Callback function used to free data from a list.
+ */
+typedef void (*xmlListDeallocator) (xmlLinkPtr lk);
+/**
+ * xmlListDataCompare:
+ * @data0: the first data
+ * @data1: the second data
+ *
+ * Callback function used to compare 2 data.
+ *
+ * Returns 0 is equality, -1 or 1 otherwise depending on the ordering.
+ */
+typedef int (*xmlListDataCompare) (const void *data0, const void *data1);
+/**
+ * xmlListWalker:
+ * @data: the data found in the list
+ * @user: extra user provided data to the walker
+ *
+ * Callback function used when walking a list with xmlListWalk().
+ *
+ * Returns 0 to stop walking the list, 1 otherwise.
+ */
+typedef int (*xmlListWalker) (const void *data, const void *user);
+
+/* Creation/Deletion */
+XMLPUBFUN xmlListPtr XMLCALL
+ xmlListCreate (xmlListDeallocator deallocator,
+ xmlListDataCompare compare);
+XMLPUBFUN void XMLCALL
+ xmlListDelete (xmlListPtr l);
+
+/* Basic Operators */
+XMLPUBFUN void * XMLCALL
+ xmlListSearch (xmlListPtr l,
+ void *data);
+XMLPUBFUN void * XMLCALL
+ xmlListReverseSearch (xmlListPtr l,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlListInsert (xmlListPtr l,
+ void *data) ;
+XMLPUBFUN int XMLCALL
+ xmlListAppend (xmlListPtr l,
+ void *data) ;
+XMLPUBFUN int XMLCALL
+ xmlListRemoveFirst (xmlListPtr l,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlListRemoveLast (xmlListPtr l,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlListRemoveAll (xmlListPtr l,
+ void *data);
+XMLPUBFUN void XMLCALL
+ xmlListClear (xmlListPtr l);
+XMLPUBFUN int XMLCALL
+ xmlListEmpty (xmlListPtr l);
+XMLPUBFUN xmlLinkPtr XMLCALL
+ xmlListFront (xmlListPtr l);
+XMLPUBFUN xmlLinkPtr XMLCALL
+ xmlListEnd (xmlListPtr l);
+XMLPUBFUN int XMLCALL
+ xmlListSize (xmlListPtr l);
+
+XMLPUBFUN void XMLCALL
+ xmlListPopFront (xmlListPtr l);
+XMLPUBFUN void XMLCALL
+ xmlListPopBack (xmlListPtr l);
+XMLPUBFUN int XMLCALL
+ xmlListPushFront (xmlListPtr l,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlListPushBack (xmlListPtr l,
+ void *data);
+
+/* Advanced Operators */
+XMLPUBFUN void XMLCALL
+ xmlListReverse (xmlListPtr l);
+XMLPUBFUN void XMLCALL
+ xmlListSort (xmlListPtr l);
+XMLPUBFUN void XMLCALL
+ xmlListWalk (xmlListPtr l,
+ xmlListWalker walker,
+ const void *user);
+XMLPUBFUN void XMLCALL
+ xmlListReverseWalk (xmlListPtr l,
+ xmlListWalker walker,
+ const void *user);
+XMLPUBFUN void XMLCALL
+ xmlListMerge (xmlListPtr l1,
+ xmlListPtr l2);
+XMLPUBFUN xmlListPtr XMLCALL
+ xmlListDup (const xmlListPtr old);
+XMLPUBFUN int XMLCALL
+ xmlListCopy (xmlListPtr cur,
+ const xmlListPtr old);
+/* Link operators */
+XMLPUBFUN void * XMLCALL
+ xmlLinkGetData (xmlLinkPtr lk);
+
+/* xmlListUnique() */
+/* xmlListSwap */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_LINK_INCLUDE__ */
--- /dev/null
+/*
+ * Summary: minimal FTP implementation
+ * Description: minimal FTP implementation allowing to fetch resources
+ * like external subset.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __NANO_FTP_H__
+#define __NANO_FTP_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_FTP_ENABLED
+
+/* Needed for portability to Windows 64 bits */
+#if defined(__MINGW32__) || defined(_WIN32_WCE)
+#include <winsock2.h>
+#else
+/**
+ * SOCKET:
+ *
+ * macro used to provide portability of code to windows sockets
+ */
+#define SOCKET int
+/**
+ * INVALID_SOCKET:
+ *
+ * macro used to provide portability of code to windows sockets
+ * the value to be used when the socket is not valid
+ */
+#undef INVALID_SOCKET
+#define INVALID_SOCKET (-1)
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * ftpListCallback:
+ * @userData: user provided data for the callback
+ * @filename: the file name (including "->" when links are shown)
+ * @attrib: the attribute string
+ * @owner: the owner string
+ * @group: the group string
+ * @size: the file size
+ * @links: the link count
+ * @year: the year
+ * @month: the month
+ * @day: the day
+ * @hour: the hour
+ * @minute: the minute
+ *
+ * A callback for the xmlNanoFTPList command.
+ * Note that only one of year and day:minute are specified.
+ */
+typedef void (*ftpListCallback) (void *userData,
+ const char *filename, const char *attrib,
+ const char *owner, const char *group,
+ unsigned long size, int links, int year,
+ const char *month, int day, int hour,
+ int minute);
+/**
+ * ftpDataCallback:
+ * @userData: the user provided context
+ * @data: the data received
+ * @len: its size in bytes
+ *
+ * A callback for the xmlNanoFTPGet command.
+ */
+typedef void (*ftpDataCallback) (void *userData,
+ const char *data,
+ int len);
+
+/*
+ * Init
+ */
+XMLPUBFUN void XMLCALL
+ xmlNanoFTPInit (void);
+XMLPUBFUN void XMLCALL
+ xmlNanoFTPCleanup (void);
+
+/*
+ * Creating/freeing contexts.
+ */
+XMLPUBFUN void * XMLCALL
+ xmlNanoFTPNewCtxt (const char *URL);
+XMLPUBFUN void XMLCALL
+ xmlNanoFTPFreeCtxt (void * ctx);
+XMLPUBFUN void * XMLCALL
+ xmlNanoFTPConnectTo (const char *server,
+ int port);
+/*
+ * Opening/closing session connections.
+ */
+XMLPUBFUN void * XMLCALL
+ xmlNanoFTPOpen (const char *URL);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPConnect (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPClose (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPQuit (void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlNanoFTPScanProxy (const char *URL);
+XMLPUBFUN void XMLCALL
+ xmlNanoFTPProxy (const char *host,
+ int port,
+ const char *user,
+ const char *passwd,
+ int type);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPUpdateURL (void *ctx,
+ const char *URL);
+
+/*
+ * Rather internal commands.
+ */
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPGetResponse (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPCheckResponse (void *ctx);
+
+/*
+ * CD/DIR/GET handlers.
+ */
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPCwd (void *ctx,
+ const char *directory);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPDele (void *ctx,
+ const char *file);
+
+XMLPUBFUN SOCKET XMLCALL
+ xmlNanoFTPGetConnection (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPCloseConnection(void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPList (void *ctx,
+ ftpListCallback callback,
+ void *userData,
+ const char *filename);
+XMLPUBFUN SOCKET XMLCALL
+ xmlNanoFTPGetSocket (void *ctx,
+ const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPGet (void *ctx,
+ ftpDataCallback callback,
+ void *userData,
+ const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlNanoFTPRead (void *ctx,
+ void *dest,
+ int len);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LIBXML_FTP_ENABLED */
+#endif /* __NANO_FTP_H__ */
--- /dev/null
+/*
+ * Summary: minimal HTTP implementation
+ * Description: minimal HTTP implementation allowing to fetch resources
+ * like external subset.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __NANO_HTTP_H__
+#define __NANO_HTTP_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_HTTP_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+XMLPUBFUN void XMLCALL
+ xmlNanoHTTPInit (void);
+XMLPUBFUN void XMLCALL
+ xmlNanoHTTPCleanup (void);
+XMLPUBFUN void XMLCALL
+ xmlNanoHTTPScanProxy (const char *URL);
+XMLPUBFUN int XMLCALL
+ xmlNanoHTTPFetch (const char *URL,
+ const char *filename,
+ char **contentType);
+XMLPUBFUN void * XMLCALL
+ xmlNanoHTTPMethod (const char *URL,
+ const char *method,
+ const char *input,
+ char **contentType,
+ const char *headers,
+ int ilen);
+XMLPUBFUN void * XMLCALL
+ xmlNanoHTTPMethodRedir (const char *URL,
+ const char *method,
+ const char *input,
+ char **contentType,
+ char **redir,
+ const char *headers,
+ int ilen);
+XMLPUBFUN void * XMLCALL
+ xmlNanoHTTPOpen (const char *URL,
+ char **contentType);
+XMLPUBFUN void * XMLCALL
+ xmlNanoHTTPOpenRedir (const char *URL,
+ char **contentType,
+ char **redir);
+XMLPUBFUN int XMLCALL
+ xmlNanoHTTPReturnCode (void *ctx);
+XMLPUBFUN const char * XMLCALL
+ xmlNanoHTTPAuthHeader (void *ctx);
+XMLPUBFUN const char * XMLCALL
+ xmlNanoHTTPRedir (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoHTTPContentLength( void * ctx );
+XMLPUBFUN const char * XMLCALL
+ xmlNanoHTTPEncoding (void *ctx);
+XMLPUBFUN const char * XMLCALL
+ xmlNanoHTTPMimeType (void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlNanoHTTPRead (void *ctx,
+ void *dest,
+ int len);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlNanoHTTPSave (void *ctxt,
+ const char *filename);
+#endif /* LIBXML_OUTPUT_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlNanoHTTPClose (void *ctx);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_HTTP_ENABLED */
+#endif /* __NANO_HTTP_H__ */
--- /dev/null
+/*
+ * Summary: the core parser module
+ * Description: Interfaces, constants and types related to the XML parser
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_PARSER_H__
+#define __XML_PARSER_H__
+
+#include <stdarg.h>
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/dict.h>
+#include <libxml/hash.h>
+#include <libxml/valid.h>
+#include <libxml/entities.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xmlstring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * XML_DEFAULT_VERSION:
+ *
+ * The default version of XML used: 1.0
+ */
+#define XML_DEFAULT_VERSION "1.0"
+
+/**
+ * xmlParserInput:
+ *
+ * An xmlParserInput is an input flow for the XML processor.
+ * Each entity parsed is associated an xmlParserInput (except the
+ * few predefined ones). This is the case both for internal entities
+ * - in which case the flow is already completely in memory - or
+ * external entities - in which case we use the buf structure for
+ * progressive reading and I18N conversions to the internal UTF-8 format.
+ */
+
+/**
+ * xmlParserInputDeallocate:
+ * @str: the string to deallocate
+ *
+ * Callback for freeing some parser input allocations.
+ */
+typedef void (* xmlParserInputDeallocate)(xmlChar *str);
+
+struct _xmlParserInput {
+ /* Input buffer */
+ xmlParserInputBufferPtr buf; /* UTF-8 encoded buffer */
+
+ const char *filename; /* The file analyzed, if any */
+ const char *directory; /* the directory/base of the file */
+ const xmlChar *base; /* Base of the array to parse */
+ const xmlChar *cur; /* Current char being parsed */
+ const xmlChar *end; /* end of the array to parse */
+ int length; /* length if known */
+ int line; /* Current line */
+ int col; /* Current column */
+ /*
+ * NOTE: consumed is only tested for equality in the parser code,
+ * so even if there is an overflow this should not give troubles
+ * for parsing very large instances.
+ */
+ unsigned long consumed; /* How many xmlChars already consumed */
+ xmlParserInputDeallocate free; /* function to deallocate the base */
+ const xmlChar *encoding; /* the encoding string for entity */
+ const xmlChar *version; /* the version string for entity */
+ int standalone; /* Was that entity marked standalone */
+ int id; /* an unique identifier for the entity */
+};
+
+/**
+ * xmlParserNodeInfo:
+ *
+ * The parser can be asked to collect Node informations, i.e. at what
+ * place in the file they were detected.
+ * NOTE: This is off by default and not very well tested.
+ */
+typedef struct _xmlParserNodeInfo xmlParserNodeInfo;
+typedef xmlParserNodeInfo *xmlParserNodeInfoPtr;
+
+struct _xmlParserNodeInfo {
+ const struct _xmlNode* node;
+ /* Position & line # that text that created the node begins & ends on */
+ unsigned long begin_pos;
+ unsigned long begin_line;
+ unsigned long end_pos;
+ unsigned long end_line;
+};
+
+typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
+typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
+struct _xmlParserNodeInfoSeq {
+ unsigned long maximum;
+ unsigned long length;
+ xmlParserNodeInfo* buffer;
+};
+
+/**
+ * xmlParserInputState:
+ *
+ * The parser is now working also as a state based parser.
+ * The recursive one use the state info for entities processing.
+ */
+typedef enum {
+ XML_PARSER_EOF = -1, /* nothing is to be parsed */
+ XML_PARSER_START = 0, /* nothing has been parsed */
+ XML_PARSER_MISC, /* Misc* before int subset */
+ XML_PARSER_PI, /* Within a processing instruction */
+ XML_PARSER_DTD, /* within some DTD content */
+ XML_PARSER_PROLOG, /* Misc* after internal subset */
+ XML_PARSER_COMMENT, /* within a comment */
+ XML_PARSER_START_TAG, /* within a start tag */
+ XML_PARSER_CONTENT, /* within the content */
+ XML_PARSER_CDATA_SECTION, /* within a CDATA section */
+ XML_PARSER_END_TAG, /* within a closing tag */
+ XML_PARSER_ENTITY_DECL, /* within an entity declaration */
+ XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */
+ XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */
+ XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */
+ XML_PARSER_EPILOG, /* the Misc* after the last end tag */
+ XML_PARSER_IGNORE, /* within an IGNORED section */
+ XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */
+} xmlParserInputState;
+
+/**
+ * XML_DETECT_IDS:
+ *
+ * Bit in the loadsubset context field to tell to do ID/REFs lookups.
+ * Use it to initialize xmlLoadExtDtdDefaultValue.
+ */
+#define XML_DETECT_IDS 2
+
+/**
+ * XML_COMPLETE_ATTRS:
+ *
+ * Bit in the loadsubset context field to tell to do complete the
+ * elements attributes lists with the ones defaulted from the DTDs.
+ * Use it to initialize xmlLoadExtDtdDefaultValue.
+ */
+#define XML_COMPLETE_ATTRS 4
+
+/**
+ * XML_SKIP_IDS:
+ *
+ * Bit in the loadsubset context field to tell to not do ID/REFs registration.
+ * Used to initialize xmlLoadExtDtdDefaultValue in some special cases.
+ */
+#define XML_SKIP_IDS 8
+
+/**
+ * xmlParserMode:
+ *
+ * A parser can operate in various modes
+ */
+typedef enum {
+ XML_PARSE_UNKNOWN = 0,
+ XML_PARSE_DOM = 1,
+ XML_PARSE_SAX = 2,
+ XML_PARSE_PUSH_DOM = 3,
+ XML_PARSE_PUSH_SAX = 4,
+ XML_PARSE_READER = 5
+} xmlParserMode;
+
+/**
+ * xmlParserCtxt:
+ *
+ * The parser context.
+ * NOTE This doesn't completely define the parser state, the (current ?)
+ * design of the parser uses recursive function calls since this allow
+ * and easy mapping from the production rules of the specification
+ * to the actual code. The drawback is that the actual function call
+ * also reflect the parser state. However most of the parsing routines
+ * takes as the only argument the parser context pointer, so migrating
+ * to a state based parser for progressive parsing shouldn't be too hard.
+ */
+struct _xmlParserCtxt {
+ struct _xmlSAXHandler *sax; /* The SAX handler */
+ void *userData; /* For SAX interface only, used by DOM build */
+ xmlDocPtr myDoc; /* the document being built */
+ int wellFormed; /* is the document well formed */
+ int replaceEntities; /* shall we replace entities ? */
+ const xmlChar *version; /* the XML version string */
+ const xmlChar *encoding; /* the declared encoding, if any */
+ int standalone; /* standalone document */
+ int html; /* an HTML(1)/Docbook(2) document
+ * 3 is HTML after <head>
+ * 10 is HTML after <body>
+ */
+
+ /* Input stream stack */
+ xmlParserInputPtr input; /* Current input stream */
+ int inputNr; /* Number of current input streams */
+ int inputMax; /* Max number of input streams */
+ xmlParserInputPtr *inputTab; /* stack of inputs */
+
+ /* Node analysis stack only used for DOM building */
+ xmlNodePtr node; /* Current parsed Node */
+ int nodeNr; /* Depth of the parsing stack */
+ int nodeMax; /* Max depth of the parsing stack */
+ xmlNodePtr *nodeTab; /* array of nodes */
+
+ int record_info; /* Whether node info should be kept */
+ xmlParserNodeInfoSeq node_seq; /* info about each node parsed */
+
+ int errNo; /* error code */
+
+ int hasExternalSubset; /* reference and external subset */
+ int hasPErefs; /* the internal subset has PE refs */
+ int external; /* are we parsing an external entity */
+
+ int valid; /* is the document valid */
+ int validate; /* shall we try to validate ? */
+ xmlValidCtxt vctxt; /* The validity context */
+
+ xmlParserInputState instate; /* current type of input */
+ int token; /* next char look-ahead */
+
+ char *directory; /* the data directory */
+
+ /* Node name stack */
+ const xmlChar *name; /* Current parsed Node */
+ int nameNr; /* Depth of the parsing stack */
+ int nameMax; /* Max depth of the parsing stack */
+ const xmlChar * *nameTab; /* array of nodes */
+
+ long nbChars; /* number of xmlChar processed */
+ long checkIndex; /* used by progressive parsing lookup */
+ int keepBlanks; /* ugly but ... */
+ int disableSAX; /* SAX callbacks are disabled */
+ int inSubset; /* Parsing is in int 1/ext 2 subset */
+ const xmlChar * intSubName; /* name of subset */
+ xmlChar * extSubURI; /* URI of external subset */
+ xmlChar * extSubSystem; /* SYSTEM ID of external subset */
+
+ /* xml:space values */
+ int * space; /* Should the parser preserve spaces */
+ int spaceNr; /* Depth of the parsing stack */
+ int spaceMax; /* Max depth of the parsing stack */
+ int * spaceTab; /* array of space infos */
+
+ int depth; /* to prevent entity substitution loops */
+ xmlParserInputPtr entity; /* used to check entities boundaries */
+ int charset; /* encoding of the in-memory content
+ actually an xmlCharEncoding */
+ int nodelen; /* Those two fields are there to */
+ int nodemem; /* Speed up large node parsing */
+ int pedantic; /* signal pedantic warnings */
+ void *_private; /* For user data, libxml won't touch it */
+
+ int loadsubset; /* should the external subset be loaded */
+ int linenumbers; /* set line number in element content */
+ void *catalogs; /* document's own catalog */
+ int recovery; /* run in recovery mode */
+ int progressive; /* is this a progressive parsing */
+ xmlDictPtr dict; /* dictionnary for the parser */
+ const xmlChar * *atts; /* array for the attributes callbacks */
+ int maxatts; /* the size of the array */
+ int docdict; /* use strings from dict to build tree */
+
+ /*
+ * pre-interned strings
+ */
+ const xmlChar *str_xml;
+ const xmlChar *str_xmlns;
+ const xmlChar *str_xml_ns;
+
+ /*
+ * Everything below is used only by the new SAX mode
+ */
+ int sax2; /* operating in the new SAX mode */
+ int nsNr; /* the number of inherited namespaces */
+ int nsMax; /* the size of the arrays */
+ const xmlChar * *nsTab; /* the array of prefix/namespace name */
+ int *attallocs; /* which attribute were allocated */
+ void * *pushTab; /* array of data for push */
+ xmlHashTablePtr attsDefault; /* defaulted attributes if any */
+ xmlHashTablePtr attsSpecial; /* non-CDATA attributes if any */
+ int nsWellFormed; /* is the document XML Nanespace okay */
+ int options; /* Extra options */
+
+ /*
+ * Those fields are needed only for treaming parsing so far
+ */
+ int dictNames; /* Use dictionary names for the tree */
+ int freeElemsNr; /* number of freed element nodes */
+ xmlNodePtr freeElems; /* List of freed element nodes */
+ int freeAttrsNr; /* number of freed attributes nodes */
+ xmlAttrPtr freeAttrs; /* List of freed attributes nodes */
+
+ /*
+ * the complete error informations for the last error.
+ */
+ xmlError lastError;
+ xmlParserMode parseMode; /* the parser mode */
+ unsigned long nbentities; /* number of entities references */
+ unsigned long sizeentities; /* size of parsed entities */
+
+ /* for use by HTML non-recursive parser */
+ xmlParserNodeInfo *nodeInfo; /* Current NodeInfo */
+ int nodeInfoNr; /* Depth of the parsing stack */
+ int nodeInfoMax; /* Max depth of the parsing stack */
+ xmlParserNodeInfo *nodeInfoTab; /* array of nodeInfos */
+
+ int input_id; /* we need to label inputs */
+ unsigned long sizeentcopy; /* volume of entity copy */
+};
+
+/**
+ * xmlSAXLocator:
+ *
+ * A SAX Locator.
+ */
+struct _xmlSAXLocator {
+ const xmlChar *(*getPublicId)(void *ctx);
+ const xmlChar *(*getSystemId)(void *ctx);
+ int (*getLineNumber)(void *ctx);
+ int (*getColumnNumber)(void *ctx);
+};
+
+/**
+ * xmlSAXHandler:
+ *
+ * A SAX handler is bunch of callbacks called by the parser when processing
+ * of the input generate data or structure informations.
+ */
+
+/**
+ * resolveEntitySAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @publicId: The public ID of the entity
+ * @systemId: The system ID of the entity
+ *
+ * Callback:
+ * The entity loader, to control the loading of external entities,
+ * the application can either:
+ * - override this resolveEntity() callback in the SAX block
+ * - or better use the xmlSetExternalEntityLoader() function to
+ * set up it's own entity resolution routine
+ *
+ * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
+ */
+typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+/**
+ * internalSubsetSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: the root element name
+ * @ExternalID: the external ID
+ * @SystemID: the SYSTEM ID (e.g. filename or URL)
+ *
+ * Callback on internal subset declaration.
+ */
+typedef void (*internalSubsetSAXFunc) (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+/**
+ * externalSubsetSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: the root element name
+ * @ExternalID: the external ID
+ * @SystemID: the SYSTEM ID (e.g. filename or URL)
+ *
+ * Callback on external subset declaration.
+ */
+typedef void (*externalSubsetSAXFunc) (void *ctx,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+/**
+ * getEntitySAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The entity name
+ *
+ * Get an entity by name.
+ *
+ * Returns the xmlEntityPtr if found.
+ */
+typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
+ const xmlChar *name);
+/**
+ * getParameterEntitySAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The entity name
+ *
+ * Get a parameter entity by name.
+ *
+ * Returns the xmlEntityPtr if found.
+ */
+typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx,
+ const xmlChar *name);
+/**
+ * entityDeclSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: the entity name
+ * @type: the entity type
+ * @publicId: The public ID of the entity
+ * @systemId: The system ID of the entity
+ * @content: the entity value (without processing).
+ *
+ * An entity definition has been parsed.
+ */
+typedef void (*entityDeclSAXFunc) (void *ctx,
+ const xmlChar *name,
+ int type,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ xmlChar *content);
+/**
+ * notationDeclSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The name of the notation
+ * @publicId: The public ID of the entity
+ * @systemId: The system ID of the entity
+ *
+ * What to do when a notation declaration has been parsed.
+ */
+typedef void (*notationDeclSAXFunc)(void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId);
+/**
+ * attributeDeclSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @elem: the name of the element
+ * @fullname: the attribute name
+ * @type: the attribute type
+ * @def: the type of default value
+ * @defaultValue: the attribute default value
+ * @tree: the tree of enumerated value set
+ *
+ * An attribute definition has been parsed.
+ */
+typedef void (*attributeDeclSAXFunc)(void *ctx,
+ const xmlChar *elem,
+ const xmlChar *fullname,
+ int type,
+ int def,
+ const xmlChar *defaultValue,
+ xmlEnumerationPtr tree);
+/**
+ * elementDeclSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: the element name
+ * @type: the element type
+ * @content: the element value tree
+ *
+ * An element definition has been parsed.
+ */
+typedef void (*elementDeclSAXFunc)(void *ctx,
+ const xmlChar *name,
+ int type,
+ xmlElementContentPtr content);
+/**
+ * unparsedEntityDeclSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The name of the entity
+ * @publicId: The public ID of the entity
+ * @systemId: The system ID of the entity
+ * @notationName: the name of the notation
+ *
+ * What to do when an unparsed entity declaration is parsed.
+ */
+typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
+ const xmlChar *name,
+ const xmlChar *publicId,
+ const xmlChar *systemId,
+ const xmlChar *notationName);
+/**
+ * setDocumentLocatorSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @loc: A SAX Locator
+ *
+ * Receive the document locator at startup, actually xmlDefaultSAXLocator.
+ * Everything is available on the context, so this is useless in our case.
+ */
+typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
+ xmlSAXLocatorPtr loc);
+/**
+ * startDocumentSAXFunc:
+ * @ctx: the user data (XML parser context)
+ *
+ * Called when the document start being processed.
+ */
+typedef void (*startDocumentSAXFunc) (void *ctx);
+/**
+ * endDocumentSAXFunc:
+ * @ctx: the user data (XML parser context)
+ *
+ * Called when the document end has been detected.
+ */
+typedef void (*endDocumentSAXFunc) (void *ctx);
+/**
+ * startElementSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The element name, including namespace prefix
+ * @atts: An array of name/value attributes pairs, NULL terminated
+ *
+ * Called when an opening tag has been processed.
+ */
+typedef void (*startElementSAXFunc) (void *ctx,
+ const xmlChar *name,
+ const xmlChar **atts);
+/**
+ * endElementSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The element name
+ *
+ * Called when the end of an element has been detected.
+ */
+typedef void (*endElementSAXFunc) (void *ctx,
+ const xmlChar *name);
+/**
+ * attributeSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The attribute name, including namespace prefix
+ * @value: The attribute value
+ *
+ * Handle an attribute that has been read by the parser.
+ * The default handling is to convert the attribute into an
+ * DOM subtree and past it in a new xmlAttr element added to
+ * the element.
+ */
+typedef void (*attributeSAXFunc) (void *ctx,
+ const xmlChar *name,
+ const xmlChar *value);
+/**
+ * referenceSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @name: The entity name
+ *
+ * Called when an entity reference is detected.
+ */
+typedef void (*referenceSAXFunc) (void *ctx,
+ const xmlChar *name);
+/**
+ * charactersSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @ch: a xmlChar string
+ * @len: the number of xmlChar
+ *
+ * Receiving some chars from the parser.
+ */
+typedef void (*charactersSAXFunc) (void *ctx,
+ const xmlChar *ch,
+ int len);
+/**
+ * ignorableWhitespaceSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @ch: a xmlChar string
+ * @len: the number of xmlChar
+ *
+ * Receiving some ignorable whitespaces from the parser.
+ * UNUSED: by default the DOM building will use characters.
+ */
+typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
+ const xmlChar *ch,
+ int len);
+/**
+ * processingInstructionSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @target: the target name
+ * @data: the PI data's
+ *
+ * A processing instruction has been parsed.
+ */
+typedef void (*processingInstructionSAXFunc) (void *ctx,
+ const xmlChar *target,
+ const xmlChar *data);
+/**
+ * commentSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @value: the comment content
+ *
+ * A comment has been parsed.
+ */
+typedef void (*commentSAXFunc) (void *ctx,
+ const xmlChar *value);
+/**
+ * cdataBlockSAXFunc:
+ * @ctx: the user data (XML parser context)
+ * @value: The pcdata content
+ * @len: the block length
+ *
+ * Called when a pcdata block has been parsed.
+ */
+typedef void (*cdataBlockSAXFunc) (
+ void *ctx,
+ const xmlChar *value,
+ int len);
+/**
+ * warningSAXFunc:
+ * @ctx: an XML parser context
+ * @msg: the message to display/transmit
+ * @...: extra parameters for the message display
+ *
+ * Display and format a warning messages, callback.
+ */
+typedef void (XMLCDECL *warningSAXFunc) (void *ctx,
+ const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+/**
+ * errorSAXFunc:
+ * @ctx: an XML parser context
+ * @msg: the message to display/transmit
+ * @...: extra parameters for the message display
+ *
+ * Display and format an error messages, callback.
+ */
+typedef void (XMLCDECL *errorSAXFunc) (void *ctx,
+ const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+/**
+ * fatalErrorSAXFunc:
+ * @ctx: an XML parser context
+ * @msg: the message to display/transmit
+ * @...: extra parameters for the message display
+ *
+ * Display and format fatal error messages, callback.
+ * Note: so far fatalError() SAX callbacks are not used, error()
+ * get all the callbacks for errors.
+ */
+typedef void (XMLCDECL *fatalErrorSAXFunc) (void *ctx,
+ const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+/**
+ * isStandaloneSAXFunc:
+ * @ctx: the user data (XML parser context)
+ *
+ * Is this document tagged standalone?
+ *
+ * Returns 1 if true
+ */
+typedef int (*isStandaloneSAXFunc) (void *ctx);
+/**
+ * hasInternalSubsetSAXFunc:
+ * @ctx: the user data (XML parser context)
+ *
+ * Does this document has an internal subset.
+ *
+ * Returns 1 if true
+ */
+typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
+
+/**
+ * hasExternalSubsetSAXFunc:
+ * @ctx: the user data (XML parser context)
+ *
+ * Does this document has an external subset?
+ *
+ * Returns 1 if true
+ */
+typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
+
+/************************************************************************
+ * *
+ * The SAX version 2 API extensions *
+ * *
+ ************************************************************************/
+/**
+ * XML_SAX2_MAGIC:
+ *
+ * Special constant found in SAX2 blocks initialized fields
+ */
+#define XML_SAX2_MAGIC 0xDEEDBEAF
+
+/**
+ * startElementNsSAX2Func:
+ * @ctx: the user data (XML parser context)
+ * @localname: the local name of the element
+ * @prefix: the element namespace prefix if available
+ * @URI: the element namespace name if available
+ * @nb_namespaces: number of namespace definitions on that node
+ * @namespaces: pointer to the array of prefix/URI pairs namespace definitions
+ * @nb_attributes: the number of attributes on that node
+ * @nb_defaulted: the number of defaulted attributes. The defaulted
+ * ones are at the end of the array
+ * @attributes: pointer to the array of (localname/prefix/URI/value/end)
+ * attribute values.
+ *
+ * SAX2 callback when an element start has been detected by the parser.
+ * It provides the namespace informations for the element, as well as
+ * the new namespace declarations on the element.
+ */
+
+typedef void (*startElementNsSAX2Func) (void *ctx,
+ const xmlChar *localname,
+ const xmlChar *prefix,
+ const xmlChar *URI,
+ int nb_namespaces,
+ const xmlChar **namespaces,
+ int nb_attributes,
+ int nb_defaulted,
+ const xmlChar **attributes);
+
+/**
+ * endElementNsSAX2Func:
+ * @ctx: the user data (XML parser context)
+ * @localname: the local name of the element
+ * @prefix: the element namespace prefix if available
+ * @URI: the element namespace name if available
+ *
+ * SAX2 callback when an element end has been detected by the parser.
+ * It provides the namespace informations for the element.
+ */
+
+typedef void (*endElementNsSAX2Func) (void *ctx,
+ const xmlChar *localname,
+ const xmlChar *prefix,
+ const xmlChar *URI);
+
+
+struct _xmlSAXHandler {
+ internalSubsetSAXFunc internalSubset;
+ isStandaloneSAXFunc isStandalone;
+ hasInternalSubsetSAXFunc hasInternalSubset;
+ hasExternalSubsetSAXFunc hasExternalSubset;
+ resolveEntitySAXFunc resolveEntity;
+ getEntitySAXFunc getEntity;
+ entityDeclSAXFunc entityDecl;
+ notationDeclSAXFunc notationDecl;
+ attributeDeclSAXFunc attributeDecl;
+ elementDeclSAXFunc elementDecl;
+ unparsedEntityDeclSAXFunc unparsedEntityDecl;
+ setDocumentLocatorSAXFunc setDocumentLocator;
+ startDocumentSAXFunc startDocument;
+ endDocumentSAXFunc endDocument;
+ startElementSAXFunc startElement;
+ endElementSAXFunc endElement;
+ referenceSAXFunc reference;
+ charactersSAXFunc characters;
+ ignorableWhitespaceSAXFunc ignorableWhitespace;
+ processingInstructionSAXFunc processingInstruction;
+ commentSAXFunc comment;
+ warningSAXFunc warning;
+ errorSAXFunc error;
+ fatalErrorSAXFunc fatalError; /* unused error() get all the errors */
+ getParameterEntitySAXFunc getParameterEntity;
+ cdataBlockSAXFunc cdataBlock;
+ externalSubsetSAXFunc externalSubset;
+ unsigned int initialized;
+ /* The following fields are extensions available only on version 2 */
+ void *_private;
+ startElementNsSAX2Func startElementNs;
+ endElementNsSAX2Func endElementNs;
+ xmlStructuredErrorFunc serror;
+};
+
+/*
+ * SAX Version 1
+ */
+typedef struct _xmlSAXHandlerV1 xmlSAXHandlerV1;
+typedef xmlSAXHandlerV1 *xmlSAXHandlerV1Ptr;
+struct _xmlSAXHandlerV1 {
+ internalSubsetSAXFunc internalSubset;
+ isStandaloneSAXFunc isStandalone;
+ hasInternalSubsetSAXFunc hasInternalSubset;
+ hasExternalSubsetSAXFunc hasExternalSubset;
+ resolveEntitySAXFunc resolveEntity;
+ getEntitySAXFunc getEntity;
+ entityDeclSAXFunc entityDecl;
+ notationDeclSAXFunc notationDecl;
+ attributeDeclSAXFunc attributeDecl;
+ elementDeclSAXFunc elementDecl;
+ unparsedEntityDeclSAXFunc unparsedEntityDecl;
+ setDocumentLocatorSAXFunc setDocumentLocator;
+ startDocumentSAXFunc startDocument;
+ endDocumentSAXFunc endDocument;
+ startElementSAXFunc startElement;
+ endElementSAXFunc endElement;
+ referenceSAXFunc reference;
+ charactersSAXFunc characters;
+ ignorableWhitespaceSAXFunc ignorableWhitespace;
+ processingInstructionSAXFunc processingInstruction;
+ commentSAXFunc comment;
+ warningSAXFunc warning;
+ errorSAXFunc error;
+ fatalErrorSAXFunc fatalError; /* unused error() get all the errors */
+ getParameterEntitySAXFunc getParameterEntity;
+ cdataBlockSAXFunc cdataBlock;
+ externalSubsetSAXFunc externalSubset;
+ unsigned int initialized;
+};
+
+
+/**
+ * xmlExternalEntityLoader:
+ * @URL: The System ID of the resource requested
+ * @ID: The Public ID of the resource requested
+ * @context: the XML parser context
+ *
+ * External entity loaders types.
+ *
+ * Returns the entity input parser.
+ */
+typedef xmlParserInputPtr (*xmlExternalEntityLoader) (const char *URL,
+ const char *ID,
+ xmlParserCtxtPtr context);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <libxml/encoding.h>
+#include <libxml/xmlIO.h>
+#include <libxml/globals.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Init/Cleanup
+ */
+XMLPUBFUN void XMLCALL
+ xmlInitParser (void);
+XMLPUBFUN void XMLCALL
+ xmlCleanupParser (void);
+
+/*
+ * Input functions
+ */
+XMLPUBFUN int XMLCALL
+ xmlParserInputRead (xmlParserInputPtr in,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlParserInputGrow (xmlParserInputPtr in,
+ int len);
+
+/*
+ * Basic parsing Interfaces
+ */
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlParseDoc (const xmlChar *cur);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlParseFile (const char *filename);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlParseMemory (const char *buffer,
+ int size);
+#endif /* LIBXML_SAX1_ENABLED */
+XMLPUBFUN int XMLCALL
+ xmlSubstituteEntitiesDefault(int val);
+XMLPUBFUN int XMLCALL
+ xmlKeepBlanksDefault (int val);
+XMLPUBFUN void XMLCALL
+ xmlStopParser (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlPedanticParserDefault(int val);
+XMLPUBFUN int XMLCALL
+ xmlLineNumbersDefault (int val);
+
+#ifdef LIBXML_SAX1_ENABLED
+/*
+ * Recovery mode
+ */
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlRecoverDoc (const xmlChar *cur);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlRecoverMemory (const char *buffer,
+ int size);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlRecoverFile (const char *filename);
+#endif /* LIBXML_SAX1_ENABLED */
+
+/*
+ * Less common routines and SAX interfaces
+ */
+XMLPUBFUN int XMLCALL
+ xmlParseDocument (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt);
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlSAXUserParseFile (xmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlSAXUserParseMemory (xmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *buffer,
+ int size);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseDoc (xmlSAXHandlerPtr sax,
+ const xmlChar *cur,
+ int recovery);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseMemory (xmlSAXHandlerPtr sax,
+ const char *buffer,
+ int size,
+ int recovery);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax,
+ const char *buffer,
+ int size,
+ int recovery,
+ void *data);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseFile (xmlSAXHandlerPtr sax,
+ const char *filename,
+ int recovery);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseFileWithData (xmlSAXHandlerPtr sax,
+ const char *filename,
+ int recovery,
+ void *data);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlSAXParseEntity (xmlSAXHandlerPtr sax,
+ const char *filename);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlParseEntity (const char *filename);
+#endif /* LIBXML_SAX1_ENABLED */
+
+#ifdef LIBXML_VALID_ENABLED
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlSAXParseDTD (xmlSAXHandlerPtr sax,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlParseDTD (const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlIOParseDTD (xmlSAXHandlerPtr sax,
+ xmlParserInputBufferPtr input,
+ xmlCharEncoding enc);
+#endif /* LIBXML_VALID_ENABLE */
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlParseBalancedChunkMemory(xmlDocPtr doc,
+ xmlSAXHandlerPtr sax,
+ void *user_data,
+ int depth,
+ const xmlChar *string,
+ xmlNodePtr *lst);
+#endif /* LIBXML_SAX1_ENABLED */
+XMLPUBFUN xmlParserErrors XMLCALL
+ xmlParseInNodeContext (xmlNodePtr node,
+ const char *data,
+ int datalen,
+ int options,
+ xmlNodePtr *lst);
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc,
+ xmlSAXHandlerPtr sax,
+ void *user_data,
+ int depth,
+ const xmlChar *string,
+ xmlNodePtr *lst,
+ int recover);
+XMLPUBFUN int XMLCALL
+ xmlParseExternalEntity (xmlDocPtr doc,
+ xmlSAXHandlerPtr sax,
+ void *user_data,
+ int depth,
+ const xmlChar *URL,
+ const xmlChar *ID,
+ xmlNodePtr *lst);
+#endif /* LIBXML_SAX1_ENABLED */
+XMLPUBFUN int XMLCALL
+ xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx,
+ const xmlChar *URL,
+ const xmlChar *ID,
+ xmlNodePtr *lst);
+
+/*
+ * Parser contexts handling.
+ */
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlNewParserCtxt (void);
+XMLPUBFUN int XMLCALL
+ xmlInitParserCtxt (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlClearParserCtxt (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlFreeParserCtxt (xmlParserCtxtPtr ctxt);
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt,
+ const xmlChar* buffer,
+ const char *filename);
+#endif /* LIBXML_SAX1_ENABLED */
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateDocParserCtxt (const xmlChar *cur);
+
+#ifdef LIBXML_LEGACY_ENABLED
+/*
+ * Reading/setting optional parsing features.
+ */
+XMLPUBFUN int XMLCALL
+ xmlGetFeaturesList (int *len,
+ const char **result);
+XMLPUBFUN int XMLCALL
+ xmlGetFeature (xmlParserCtxtPtr ctxt,
+ const char *name,
+ void *result);
+XMLPUBFUN int XMLCALL
+ xmlSetFeature (xmlParserCtxtPtr ctxt,
+ const char *name,
+ void *value);
+#endif /* LIBXML_LEGACY_ENABLED */
+
+#ifdef LIBXML_PUSH_ENABLED
+/*
+ * Interfaces for the Push mode.
+ */
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *chunk,
+ int size,
+ const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlParseChunk (xmlParserCtxtPtr ctxt,
+ const char *chunk,
+ int size,
+ int terminate);
+#endif /* LIBXML_PUSH_ENABLED */
+
+/*
+ * Special I/O mode.
+ */
+
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax,
+ void *user_data,
+ xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ xmlCharEncoding enc);
+
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNewIOInputStream (xmlParserCtxtPtr ctxt,
+ xmlParserInputBufferPtr input,
+ xmlCharEncoding enc);
+
+/*
+ * Node infos.
+ */
+XMLPUBFUN const xmlParserNodeInfo* XMLCALL
+ xmlParserFindNodeInfo (const xmlParserCtxtPtr ctxt,
+ const xmlNodePtr node);
+XMLPUBFUN void XMLCALL
+ xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq);
+XMLPUBFUN void XMLCALL
+ xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq);
+XMLPUBFUN unsigned long XMLCALL
+ xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq,
+ const xmlNodePtr node);
+XMLPUBFUN void XMLCALL
+ xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt,
+ const xmlParserNodeInfoPtr info);
+
+/*
+ * External entities handling actually implemented in xmlIO.
+ */
+
+XMLPUBFUN void XMLCALL
+ xmlSetExternalEntityLoader(xmlExternalEntityLoader f);
+XMLPUBFUN xmlExternalEntityLoader XMLCALL
+ xmlGetExternalEntityLoader(void);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlLoadExternalEntity (const char *URL,
+ const char *ID,
+ xmlParserCtxtPtr ctxt);
+
+/*
+ * Index lookup, actually implemented in the encoding module
+ */
+XMLPUBFUN long XMLCALL
+ xmlByteConsumed (xmlParserCtxtPtr ctxt);
+
+/*
+ * New set of simpler/more flexible APIs
+ */
+/**
+ * xmlParserOption:
+ *
+ * This is the set of XML parser options that can be passed down
+ * to the xmlReadDoc() and similar calls.
+ */
+typedef enum {
+ XML_PARSE_RECOVER = 1<<0, /* recover on errors */
+ XML_PARSE_NOENT = 1<<1, /* substitute entities */
+ XML_PARSE_DTDLOAD = 1<<2, /* load the external subset */
+ XML_PARSE_DTDATTR = 1<<3, /* default DTD attributes */
+ XML_PARSE_DTDVALID = 1<<4, /* validate with the DTD */
+ XML_PARSE_NOERROR = 1<<5, /* suppress error reports */
+ XML_PARSE_NOWARNING = 1<<6, /* suppress warning reports */
+ XML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */
+ XML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */
+ XML_PARSE_SAX1 = 1<<9, /* use the SAX1 interface internally */
+ XML_PARSE_XINCLUDE = 1<<10,/* Implement XInclude substitition */
+ XML_PARSE_NONET = 1<<11,/* Forbid network access */
+ XML_PARSE_NODICT = 1<<12,/* Do not reuse the context dictionnary */
+ XML_PARSE_NSCLEAN = 1<<13,/* remove redundant namespaces declarations */
+ XML_PARSE_NOCDATA = 1<<14,/* merge CDATA as text nodes */
+ XML_PARSE_NOXINCNODE= 1<<15,/* do not generate XINCLUDE START/END nodes */
+ XML_PARSE_COMPACT = 1<<16,/* compact small text nodes; no modification of
+ the tree allowed afterwards (will possibly
+ crash if you try to modify the tree) */
+ XML_PARSE_OLD10 = 1<<17,/* parse using XML-1.0 before update 5 */
+ XML_PARSE_NOBASEFIX = 1<<18,/* do not fixup XINCLUDE xml:base uris */
+ XML_PARSE_HUGE = 1<<19,/* relax any hardcoded limit from the parser */
+ XML_PARSE_OLDSAX = 1<<20,/* parse using SAX2 interface before 2.7.0 */
+ XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */
+ XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */
+} xmlParserOption;
+
+XMLPUBFUN void XMLCALL
+ xmlCtxtReset (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlCtxtResetPush (xmlParserCtxtPtr ctxt,
+ const char *chunk,
+ int size,
+ const char *filename,
+ const char *encoding);
+XMLPUBFUN int XMLCALL
+ xmlCtxtUseOptions (xmlParserCtxtPtr ctxt,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlReadDoc (const xmlChar *cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlReadFile (const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlReadMemory (const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlReadFd (int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlReadIO (xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCtxtReadDoc (xmlParserCtxtPtr ctxt,
+ const xmlChar *cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCtxtReadFile (xmlParserCtxtPtr ctxt,
+ const char *filename,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCtxtReadMemory (xmlParserCtxtPtr ctxt,
+ const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCtxtReadFd (xmlParserCtxtPtr ctxt,
+ int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCtxtReadIO (xmlParserCtxtPtr ctxt,
+ xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+
+/*
+ * Library wide options
+ */
+/**
+ * xmlFeature:
+ *
+ * Used to examine the existance of features that can be enabled
+ * or disabled at compile-time.
+ * They used to be called XML_FEATURE_xxx but this clashed with Expat
+ */
+typedef enum {
+ XML_WITH_THREAD = 1,
+ XML_WITH_TREE = 2,
+ XML_WITH_OUTPUT = 3,
+ XML_WITH_PUSH = 4,
+ XML_WITH_READER = 5,
+ XML_WITH_PATTERN = 6,
+ XML_WITH_WRITER = 7,
+ XML_WITH_SAX1 = 8,
+ XML_WITH_FTP = 9,
+ XML_WITH_HTTP = 10,
+ XML_WITH_VALID = 11,
+ XML_WITH_HTML = 12,
+ XML_WITH_LEGACY = 13,
+ XML_WITH_C14N = 14,
+ XML_WITH_CATALOG = 15,
+ XML_WITH_XPATH = 16,
+ XML_WITH_XPTR = 17,
+ XML_WITH_XINCLUDE = 18,
+ XML_WITH_ICONV = 19,
+ XML_WITH_ISO8859X = 20,
+ XML_WITH_UNICODE = 21,
+ XML_WITH_REGEXP = 22,
+ XML_WITH_AUTOMATA = 23,
+ XML_WITH_EXPR = 24,
+ XML_WITH_SCHEMAS = 25,
+ XML_WITH_SCHEMATRON = 26,
+ XML_WITH_MODULES = 27,
+ XML_WITH_DEBUG = 28,
+ XML_WITH_DEBUG_MEM = 29,
+ XML_WITH_DEBUG_RUN = 30,
+ XML_WITH_ZLIB = 31,
+ XML_WITH_ICU = 32,
+ XML_WITH_LZMA = 33,
+ XML_WITH_NONE = 99999 /* just to be sure of allocation size */
+} xmlFeature;
+
+XMLPUBFUN int XMLCALL
+ xmlHasFeature (xmlFeature feature);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_PARSER_H__ */
--- /dev/null
+/*
+ * Summary: internals routines and limits exported by the parser.
+ * Description: this module exports a number of internal parsing routines
+ * they are not really all intended for applications but
+ * can prove useful doing low level processing.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_PARSER_INTERNALS_H__
+#define __XML_PARSER_INTERNALS_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/HTMLparser.h>
+#include <libxml/chvalid.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlParserMaxDepth:
+ *
+ * arbitrary depth limit for the XML documents that we allow to
+ * process. This is not a limitation of the parser but a safety
+ * boundary feature, use XML_PARSE_HUGE option to override it.
+ */
+XMLPUBVAR unsigned int xmlParserMaxDepth;
+
+/**
+ * XML_MAX_TEXT_LENGTH:
+ *
+ * Maximum size allowed for a single text node when building a tree.
+ * This is not a limitation of the parser but a safety boundary feature,
+ * use XML_PARSE_HUGE option to override it.
+ * Introduced in 2.9.0
+ */
+#define XML_MAX_TEXT_LENGTH 10000000
+
+/**
+ * XML_MAX_NAME_LENGTH:
+ *
+ * Maximum size allowed for a markup identitier
+ * This is not a limitation of the parser but a safety boundary feature,
+ * use XML_PARSE_HUGE option to override it.
+ * Note that with the use of parsing dictionaries overriding the limit
+ * may result in more runtime memory usage in face of "unfriendly' content
+ * Introduced in 2.9.0
+ */
+#define XML_MAX_NAME_LENGTH 50000
+
+/**
+ * XML_MAX_DICTIONARY_LIMIT:
+ *
+ * Maximum size allowed by the parser for a dictionary by default
+ * This is not a limitation of the parser but a safety boundary feature,
+ * use XML_PARSE_HUGE option to override it.
+ * Introduced in 2.9.0
+ */
+#define XML_MAX_DICTIONARY_LIMIT 10000000
+
+/**
+ * XML_MAX_LOOKUP_LIMIT:
+ *
+ * Maximum size allowed by the parser for ahead lookup
+ * This is an upper boundary enforced by the parser to avoid bad
+ * behaviour on "unfriendly' content
+ * Introduced in 2.9.0
+ */
+#define XML_MAX_LOOKUP_LIMIT 10000000
+
+/**
+ * XML_MAX_NAMELEN:
+ *
+ * Identifiers can be longer, but this will be more costly
+ * at runtime.
+ */
+#define XML_MAX_NAMELEN 100
+
+/**
+ * INPUT_CHUNK:
+ *
+ * The parser tries to always have that amount of input ready.
+ * One of the point is providing context when reporting errors.
+ */
+#define INPUT_CHUNK 250
+
+/************************************************************************
+ * *
+ * UNICODE version of the macros. *
+ * *
+ ************************************************************************/
+/**
+ * IS_BYTE_CHAR:
+ * @c: an byte value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [2] Char ::= #x9 | #xA | #xD | [#x20...]
+ * any byte character in the accepted range
+ */
+#define IS_BYTE_CHAR(c) xmlIsChar_ch(c)
+
+/**
+ * IS_CHAR:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD]
+ * | [#x10000-#x10FFFF]
+ * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
+ */
+#define IS_CHAR(c) xmlIsCharQ(c)
+
+/**
+ * IS_CHAR_CH:
+ * @c: an xmlChar (usually an unsigned char)
+ *
+ * Behaves like IS_CHAR on single-byte value
+ */
+#define IS_CHAR_CH(c) xmlIsChar_ch(c)
+
+/**
+ * IS_BLANK:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [3] S ::= (#x20 | #x9 | #xD | #xA)+
+ */
+#define IS_BLANK(c) xmlIsBlankQ(c)
+
+/**
+ * IS_BLANK_CH:
+ * @c: an xmlChar value (normally unsigned char)
+ *
+ * Behaviour same as IS_BLANK
+ */
+#define IS_BLANK_CH(c) xmlIsBlank_ch(c)
+
+/**
+ * IS_BASECHAR:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [85] BaseChar ::= ... long list see REC ...
+ */
+#define IS_BASECHAR(c) xmlIsBaseCharQ(c)
+
+/**
+ * IS_DIGIT:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [88] Digit ::= ... long list see REC ...
+ */
+#define IS_DIGIT(c) xmlIsDigitQ(c)
+
+/**
+ * IS_DIGIT_CH:
+ * @c: an xmlChar value (usually an unsigned char)
+ *
+ * Behaves like IS_DIGIT but with a single byte argument
+ */
+#define IS_DIGIT_CH(c) xmlIsDigit_ch(c)
+
+/**
+ * IS_COMBINING:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [87] CombiningChar ::= ... long list see REC ...
+ */
+#define IS_COMBINING(c) xmlIsCombiningQ(c)
+
+/**
+ * IS_COMBINING_CH:
+ * @c: an xmlChar (usually an unsigned char)
+ *
+ * Always false (all combining chars > 0xff)
+ */
+#define IS_COMBINING_CH(c) 0
+
+/**
+ * IS_EXTENDER:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ *
+ * [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 |
+ * #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] |
+ * [#x309D-#x309E] | [#x30FC-#x30FE]
+ */
+#define IS_EXTENDER(c) xmlIsExtenderQ(c)
+
+/**
+ * IS_EXTENDER_CH:
+ * @c: an xmlChar value (usually an unsigned char)
+ *
+ * Behaves like IS_EXTENDER but with a single-byte argument
+ */
+#define IS_EXTENDER_CH(c) xmlIsExtender_ch(c)
+
+/**
+ * IS_IDEOGRAPHIC:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ *
+ * [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
+ */
+#define IS_IDEOGRAPHIC(c) xmlIsIdeographicQ(c)
+
+/**
+ * IS_LETTER:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ *
+ * [84] Letter ::= BaseChar | Ideographic
+ */
+#define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c))
+
+/**
+ * IS_LETTER_CH:
+ * @c: an xmlChar value (normally unsigned char)
+ *
+ * Macro behaves like IS_LETTER, but only check base chars
+ *
+ */
+#define IS_LETTER_CH(c) xmlIsBaseChar_ch(c)
+
+/**
+ * IS_ASCII_LETTER:
+ * @c: an xmlChar value
+ *
+ * Macro to check [a-zA-Z]
+ *
+ */
+#define IS_ASCII_LETTER(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \
+ ((0x61 <= (c)) && ((c) <= 0x7a)))
+
+/**
+ * IS_ASCII_DIGIT:
+ * @c: an xmlChar value
+ *
+ * Macro to check [0-9]
+ *
+ */
+#define IS_ASCII_DIGIT(c) ((0x30 <= (c)) && ((c) <= 0x39))
+
+/**
+ * IS_PUBIDCHAR:
+ * @c: an UNICODE value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ *
+ * [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]
+ */
+#define IS_PUBIDCHAR(c) xmlIsPubidCharQ(c)
+
+/**
+ * IS_PUBIDCHAR_CH:
+ * @c: an xmlChar value (normally unsigned char)
+ *
+ * Same as IS_PUBIDCHAR but for single-byte value
+ */
+#define IS_PUBIDCHAR_CH(c) xmlIsPubidChar_ch(c)
+
+/**
+ * SKIP_EOL:
+ * @p: and UTF8 string pointer
+ *
+ * Skips the end of line chars.
+ */
+#define SKIP_EOL(p) \
+ if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \
+ if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; }
+
+/**
+ * MOVETO_ENDTAG:
+ * @p: and UTF8 string pointer
+ *
+ * Skips to the next '>' char.
+ */
+#define MOVETO_ENDTAG(p) \
+ while ((*p) && (*(p) != '>')) (p)++
+
+/**
+ * MOVETO_STARTTAG:
+ * @p: and UTF8 string pointer
+ *
+ * Skips to the next '<' char.
+ */
+#define MOVETO_STARTTAG(p) \
+ while ((*p) && (*(p) != '<')) (p)++
+
+/**
+ * Global variables used for predefined strings.
+ */
+XMLPUBVAR const xmlChar xmlStringText[];
+XMLPUBVAR const xmlChar xmlStringTextNoenc[];
+XMLPUBVAR const xmlChar xmlStringComment[];
+
+/*
+ * Function to finish the work of the macros where needed.
+ */
+XMLPUBFUN int XMLCALL xmlIsLetter (int c);
+
+/**
+ * Parser context.
+ */
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateFileParserCtxt (const char *filename);
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateURLParserCtxt (const char *filename,
+ int options);
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateMemoryParserCtxt(const char *buffer,
+ int size);
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlCreateEntityParserCtxt(const xmlChar *URL,
+ const xmlChar *ID,
+ const xmlChar *base);
+XMLPUBFUN int XMLCALL
+ xmlSwitchEncoding (xmlParserCtxtPtr ctxt,
+ xmlCharEncoding enc);
+XMLPUBFUN int XMLCALL
+ xmlSwitchToEncoding (xmlParserCtxtPtr ctxt,
+ xmlCharEncodingHandlerPtr handler);
+XMLPUBFUN int XMLCALL
+ xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt,
+ xmlParserInputPtr input,
+ xmlCharEncodingHandlerPtr handler);
+
+#ifdef IN_LIBXML
+/* internal error reporting */
+XMLPUBFUN void XMLCALL
+ __xmlErrEncoding (xmlParserCtxtPtr ctxt,
+ xmlParserErrors xmlerr,
+ const char *msg,
+ const xmlChar * str1,
+ const xmlChar * str2);
+#endif
+
+/**
+ * Input Streams.
+ */
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNewStringInputStream (xmlParserCtxtPtr ctxt,
+ const xmlChar *buffer);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNewEntityInputStream (xmlParserCtxtPtr ctxt,
+ xmlEntityPtr entity);
+XMLPUBFUN int XMLCALL
+ xmlPushInput (xmlParserCtxtPtr ctxt,
+ xmlParserInputPtr input);
+XMLPUBFUN xmlChar XMLCALL
+ xmlPopInput (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlFreeInputStream (xmlParserInputPtr input);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNewInputFromFile (xmlParserCtxtPtr ctxt,
+ const char *filename);
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNewInputStream (xmlParserCtxtPtr ctxt);
+
+/**
+ * Namespaces.
+ */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlSplitQName (xmlParserCtxtPtr ctxt,
+ const xmlChar *name,
+ xmlChar **prefix);
+
+/**
+ * Generic production rules.
+ */
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlParseName (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseNmtoken (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseEntityValue (xmlParserCtxtPtr ctxt,
+ xmlChar **orig);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseAttValue (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseSystemLiteral (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParsePubidLiteral (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseCharData (xmlParserCtxtPtr ctxt,
+ int cdata);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseExternalID (xmlParserCtxtPtr ctxt,
+ xmlChar **publicID,
+ int strict);
+XMLPUBFUN void XMLCALL
+ xmlParseComment (xmlParserCtxtPtr ctxt);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlParsePITarget (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParsePI (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseNotationDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseEntityDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlParseDefaultDecl (xmlParserCtxtPtr ctxt,
+ xmlChar **value);
+XMLPUBFUN xmlEnumerationPtr XMLCALL
+ xmlParseNotationType (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlEnumerationPtr XMLCALL
+ xmlParseEnumerationType (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlParseEnumeratedType (xmlParserCtxtPtr ctxt,
+ xmlEnumerationPtr *tree);
+XMLPUBFUN int XMLCALL
+ xmlParseAttributeType (xmlParserCtxtPtr ctxt,
+ xmlEnumerationPtr *tree);
+XMLPUBFUN void XMLCALL
+ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlParseElementMixedContentDecl
+ (xmlParserCtxtPtr ctxt,
+ int inputchk);
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlParseElementChildrenContentDecl
+ (xmlParserCtxtPtr ctxt,
+ int inputchk);
+XMLPUBFUN int XMLCALL
+ xmlParseElementContentDecl(xmlParserCtxtPtr ctxt,
+ const xmlChar *name,
+ xmlElementContentPtr *result);
+XMLPUBFUN int XMLCALL
+ xmlParseElementDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseMarkupDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlParseCharRef (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlEntityPtr XMLCALL
+ xmlParseEntityRef (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseReference (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParsePEReference (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt);
+#ifdef LIBXML_SAX1_ENABLED
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlParseAttribute (xmlParserCtxtPtr ctxt,
+ xmlChar **value);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlParseStartTag (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseEndTag (xmlParserCtxtPtr ctxt);
+#endif /* LIBXML_SAX1_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlParseCDSect (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseContent (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseElement (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseVersionNum (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseVersionInfo (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseEncName (xmlParserCtxtPtr ctxt);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlParseEncodingDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlParseSDDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseXMLDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseTextDecl (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseMisc (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseExternalSubset (xmlParserCtxtPtr ctxt,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+/**
+ * XML_SUBSTITUTE_NONE:
+ *
+ * If no entities need to be substituted.
+ */
+#define XML_SUBSTITUTE_NONE 0
+/**
+ * XML_SUBSTITUTE_REF:
+ *
+ * Whether general entities need to be substituted.
+ */
+#define XML_SUBSTITUTE_REF 1
+/**
+ * XML_SUBSTITUTE_PEREF:
+ *
+ * Whether parameter entities need to be substituted.
+ */
+#define XML_SUBSTITUTE_PEREF 2
+/**
+ * XML_SUBSTITUTE_BOTH:
+ *
+ * Both general and parameter entities need to be substituted.
+ */
+#define XML_SUBSTITUTE_BOTH 3
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStringDecodeEntities (xmlParserCtxtPtr ctxt,
+ const xmlChar *str,
+ int what,
+ xmlChar end,
+ xmlChar end2,
+ xmlChar end3);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt,
+ const xmlChar *str,
+ int len,
+ int what,
+ xmlChar end,
+ xmlChar end2,
+ xmlChar end3);
+
+/*
+ * Generated by MACROS on top of parser.c c.f. PUSH_AND_POP.
+ */
+XMLPUBFUN int XMLCALL nodePush (xmlParserCtxtPtr ctxt,
+ xmlNodePtr value);
+XMLPUBFUN xmlNodePtr XMLCALL nodePop (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL inputPush (xmlParserCtxtPtr ctxt,
+ xmlParserInputPtr value);
+XMLPUBFUN xmlParserInputPtr XMLCALL inputPop (xmlParserCtxtPtr ctxt);
+XMLPUBFUN const xmlChar * XMLCALL namePop (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL namePush (xmlParserCtxtPtr ctxt,
+ const xmlChar *value);
+
+/*
+ * other commodities shared between parser.c and parserInternals.
+ */
+XMLPUBFUN int XMLCALL xmlSkipBlankChars (xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL xmlStringCurrentChar (xmlParserCtxtPtr ctxt,
+ const xmlChar *cur,
+ int *len);
+XMLPUBFUN void XMLCALL xmlParserHandlePEReference(xmlParserCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL xmlCheckLanguageID (const xmlChar *lang);
+
+/*
+ * Really core function shared with HTML parser.
+ */
+XMLPUBFUN int XMLCALL xmlCurrentChar (xmlParserCtxtPtr ctxt,
+ int *len);
+XMLPUBFUN int XMLCALL xmlCopyCharMultiByte (xmlChar *out,
+ int val);
+XMLPUBFUN int XMLCALL xmlCopyChar (int len,
+ xmlChar *out,
+ int val);
+XMLPUBFUN void XMLCALL xmlNextChar (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL xmlParserInputShrink (xmlParserInputPtr in);
+
+#ifdef LIBXML_HTML_ENABLED
+/*
+ * Actually comes from the HTML parser but launched from the init stuff.
+ */
+XMLPUBFUN void XMLCALL htmlInitAutoClose (void);
+XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateFileParserCtxt(const char *filename,
+ const char *encoding);
+#endif
+
+/*
+ * Specific function to keep track of entities references
+ * and used by the XSLT debugger.
+ */
+#ifdef LIBXML_LEGACY_ENABLED
+/**
+ * xmlEntityReferenceFunc:
+ * @ent: the entity
+ * @firstNode: the fist node in the chunk
+ * @lastNode: the last nod in the chunk
+ *
+ * Callback function used when one needs to be able to track back the
+ * provenance of a chunk of nodes inherited from an entity replacement.
+ */
+typedef void (*xmlEntityReferenceFunc) (xmlEntityPtr ent,
+ xmlNodePtr firstNode,
+ xmlNodePtr lastNode);
+
+XMLPUBFUN void XMLCALL xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func);
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlParseQuotedString (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlParseNamespace (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlScanName (xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL xmlParserHandleReference(xmlParserCtxtPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNamespaceParseQName (xmlParserCtxtPtr ctxt,
+ xmlChar **prefix);
+/**
+ * Entities
+ */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlDecodeEntities (xmlParserCtxtPtr ctxt,
+ int len,
+ int what,
+ xmlChar end,
+ xmlChar end2,
+ xmlChar end3);
+XMLPUBFUN void XMLCALL
+ xmlHandleEntity (xmlParserCtxtPtr ctxt,
+ xmlEntityPtr entity);
+
+#endif /* LIBXML_LEGACY_ENABLED */
+
+#ifdef IN_LIBXML
+/*
+ * internal only
+ */
+XMLPUBFUN void XMLCALL
+ xmlErrMemory (xmlParserCtxtPtr ctxt,
+ const char *extra);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_PARSER_INTERNALS_H__ */
--- /dev/null
+/*
+ * Summary: pattern expression handling
+ * Description: allows to compile and test pattern expressions for nodes
+ * either in a tree or based on a parser state.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_PATTERN_H__
+#define __XML_PATTERN_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/dict.h>
+
+#ifdef LIBXML_PATTERN_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlPattern:
+ *
+ * A compiled (XPath based) pattern to select nodes
+ */
+typedef struct _xmlPattern xmlPattern;
+typedef xmlPattern *xmlPatternPtr;
+
+/**
+ * xmlPatternFlags:
+ *
+ * This is the set of options affecting the behaviour of pattern
+ * matching with this module
+ *
+ */
+typedef enum {
+ XML_PATTERN_DEFAULT = 0, /* simple pattern match */
+ XML_PATTERN_XPATH = 1<<0, /* standard XPath pattern */
+ XML_PATTERN_XSSEL = 1<<1, /* XPath subset for schema selector */
+ XML_PATTERN_XSFIELD = 1<<2 /* XPath subset for schema field */
+} xmlPatternFlags;
+
+XMLPUBFUN void XMLCALL
+ xmlFreePattern (xmlPatternPtr comp);
+
+XMLPUBFUN void XMLCALL
+ xmlFreePatternList (xmlPatternPtr comp);
+
+XMLPUBFUN xmlPatternPtr XMLCALL
+ xmlPatterncompile (const xmlChar *pattern,
+ xmlDict *dict,
+ int flags,
+ const xmlChar **namespaces);
+XMLPUBFUN int XMLCALL
+ xmlPatternMatch (xmlPatternPtr comp,
+ xmlNodePtr node);
+
+/* streaming interfaces */
+typedef struct _xmlStreamCtxt xmlStreamCtxt;
+typedef xmlStreamCtxt *xmlStreamCtxtPtr;
+
+XMLPUBFUN int XMLCALL
+ xmlPatternStreamable (xmlPatternPtr comp);
+XMLPUBFUN int XMLCALL
+ xmlPatternMaxDepth (xmlPatternPtr comp);
+XMLPUBFUN int XMLCALL
+ xmlPatternMinDepth (xmlPatternPtr comp);
+XMLPUBFUN int XMLCALL
+ xmlPatternFromRoot (xmlPatternPtr comp);
+XMLPUBFUN xmlStreamCtxtPtr XMLCALL
+ xmlPatternGetStreamCtxt (xmlPatternPtr comp);
+XMLPUBFUN void XMLCALL
+ xmlFreeStreamCtxt (xmlStreamCtxtPtr stream);
+XMLPUBFUN int XMLCALL
+ xmlStreamPushNode (xmlStreamCtxtPtr stream,
+ const xmlChar *name,
+ const xmlChar *ns,
+ int nodeType);
+XMLPUBFUN int XMLCALL
+ xmlStreamPush (xmlStreamCtxtPtr stream,
+ const xmlChar *name,
+ const xmlChar *ns);
+XMLPUBFUN int XMLCALL
+ xmlStreamPushAttr (xmlStreamCtxtPtr stream,
+ const xmlChar *name,
+ const xmlChar *ns);
+XMLPUBFUN int XMLCALL
+ xmlStreamPop (xmlStreamCtxtPtr stream);
+XMLPUBFUN int XMLCALL
+ xmlStreamWantsAnyNode (xmlStreamCtxtPtr stream);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_PATTERN_ENABLED */
+
+#endif /* __XML_PATTERN_H__ */
--- /dev/null
+/*
+ * Summary: implementation of the Relax-NG validation
+ * Description: implementation of the Relax-NG validation
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_RELAX_NG__
+#define __XML_RELAX_NG__
+
+#include <libxml/xmlversion.h>
+#include <libxml/hash.h>
+#include <libxml/xmlstring.h>
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _xmlRelaxNG xmlRelaxNG;
+typedef xmlRelaxNG *xmlRelaxNGPtr;
+
+
+/**
+ * xmlRelaxNGValidityErrorFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of an error callback from a Relax-NG validation
+ */
+typedef void (XMLCDECL *xmlRelaxNGValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+
+/**
+ * xmlRelaxNGValidityWarningFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of a warning callback from a Relax-NG validation
+ */
+typedef void (XMLCDECL *xmlRelaxNGValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+
+/**
+ * A schemas validation context
+ */
+typedef struct _xmlRelaxNGParserCtxt xmlRelaxNGParserCtxt;
+typedef xmlRelaxNGParserCtxt *xmlRelaxNGParserCtxtPtr;
+
+typedef struct _xmlRelaxNGValidCtxt xmlRelaxNGValidCtxt;
+typedef xmlRelaxNGValidCtxt *xmlRelaxNGValidCtxtPtr;
+
+/*
+ * xmlRelaxNGValidErr:
+ *
+ * List of possible Relax NG validation errors
+ */
+typedef enum {
+ XML_RELAXNG_OK = 0,
+ XML_RELAXNG_ERR_MEMORY,
+ XML_RELAXNG_ERR_TYPE,
+ XML_RELAXNG_ERR_TYPEVAL,
+ XML_RELAXNG_ERR_DUPID,
+ XML_RELAXNG_ERR_TYPECMP,
+ XML_RELAXNG_ERR_NOSTATE,
+ XML_RELAXNG_ERR_NODEFINE,
+ XML_RELAXNG_ERR_LISTEXTRA,
+ XML_RELAXNG_ERR_LISTEMPTY,
+ XML_RELAXNG_ERR_INTERNODATA,
+ XML_RELAXNG_ERR_INTERSEQ,
+ XML_RELAXNG_ERR_INTEREXTRA,
+ XML_RELAXNG_ERR_ELEMNAME,
+ XML_RELAXNG_ERR_ATTRNAME,
+ XML_RELAXNG_ERR_ELEMNONS,
+ XML_RELAXNG_ERR_ATTRNONS,
+ XML_RELAXNG_ERR_ELEMWRONGNS,
+ XML_RELAXNG_ERR_ATTRWRONGNS,
+ XML_RELAXNG_ERR_ELEMEXTRANS,
+ XML_RELAXNG_ERR_ATTREXTRANS,
+ XML_RELAXNG_ERR_ELEMNOTEMPTY,
+ XML_RELAXNG_ERR_NOELEM,
+ XML_RELAXNG_ERR_NOTELEM,
+ XML_RELAXNG_ERR_ATTRVALID,
+ XML_RELAXNG_ERR_CONTENTVALID,
+ XML_RELAXNG_ERR_EXTRACONTENT,
+ XML_RELAXNG_ERR_INVALIDATTR,
+ XML_RELAXNG_ERR_DATAELEM,
+ XML_RELAXNG_ERR_VALELEM,
+ XML_RELAXNG_ERR_LISTELEM,
+ XML_RELAXNG_ERR_DATATYPE,
+ XML_RELAXNG_ERR_VALUE,
+ XML_RELAXNG_ERR_LIST,
+ XML_RELAXNG_ERR_NOGRAMMAR,
+ XML_RELAXNG_ERR_EXTRADATA,
+ XML_RELAXNG_ERR_LACKDATA,
+ XML_RELAXNG_ERR_INTERNAL,
+ XML_RELAXNG_ERR_ELEMWRONG,
+ XML_RELAXNG_ERR_TEXTWRONG
+} xmlRelaxNGValidErr;
+
+/*
+ * xmlRelaxNGParserFlags:
+ *
+ * List of possible Relax NG Parser flags
+ */
+typedef enum {
+ XML_RELAXNGP_NONE = 0,
+ XML_RELAXNGP_FREE_DOC = 1,
+ XML_RELAXNGP_CRNG = 2
+} xmlRelaxNGParserFlag;
+
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGInitTypes (void);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGCleanupTypes (void);
+
+/*
+ * Interfaces for parsing.
+ */
+XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL
+ xmlRelaxNGNewParserCtxt (const char *URL);
+XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL
+ xmlRelaxNGNewMemParserCtxt (const char *buffer,
+ int size);
+XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL
+ xmlRelaxNGNewDocParserCtxt (xmlDocPtr doc);
+
+XMLPUBFUN int XMLCALL
+ xmlRelaxParserSetFlag (xmlRelaxNGParserCtxtPtr ctxt,
+ int flag);
+
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGFreeParserCtxt (xmlRelaxNGParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
+ xmlRelaxNGValidityErrorFunc err,
+ xmlRelaxNGValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
+ xmlRelaxNGValidityErrorFunc *err,
+ xmlRelaxNGValidityWarningFunc *warn,
+ void **ctx);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGSetParserStructuredErrors(
+ xmlRelaxNGParserCtxtPtr ctxt,
+ xmlStructuredErrorFunc serror,
+ void *ctx);
+XMLPUBFUN xmlRelaxNGPtr XMLCALL
+ xmlRelaxNGParse (xmlRelaxNGParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGFree (xmlRelaxNGPtr schema);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGDump (FILE *output,
+ xmlRelaxNGPtr schema);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGDumpTree (FILE * output,
+ xmlRelaxNGPtr schema);
+#endif /* LIBXML_OUTPUT_ENABLED */
+/*
+ * Interfaces for validating
+ */
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
+ xmlRelaxNGValidityErrorFunc err,
+ xmlRelaxNGValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
+ xmlRelaxNGValidityErrorFunc *err,
+ xmlRelaxNGValidityWarningFunc *warn,
+ void **ctx);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt,
+ xmlStructuredErrorFunc serror, void *ctx);
+XMLPUBFUN xmlRelaxNGValidCtxtPtr XMLCALL
+ xmlRelaxNGNewValidCtxt (xmlRelaxNGPtr schema);
+XMLPUBFUN void XMLCALL
+ xmlRelaxNGFreeValidCtxt (xmlRelaxNGValidCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGValidateDoc (xmlRelaxNGValidCtxtPtr ctxt,
+ xmlDocPtr doc);
+/*
+ * Interfaces for progressive validation when possible
+ */
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGValidatePushElement (xmlRelaxNGValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGValidatePushCData (xmlRelaxNGValidCtxtPtr ctxt,
+ const xmlChar *data,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGValidatePopElement (xmlRelaxNGValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ xmlRelaxNGValidateFullElement (xmlRelaxNGValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_SCHEMAS_ENABLED */
+
+#endif /* __XML_RELAX_NG__ */
--- /dev/null
+/*
+ * Summary: internal interfaces for XML Schemas
+ * Description: internal interfaces for the XML Schemas handling
+ * and schema validity checking
+ * The Schemas development is a Work In Progress.
+ * Some of those interfaces are not garanteed to be API or ABI stable !
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SCHEMA_INTERNALS_H__
+#define __XML_SCHEMA_INTERNALS_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+
+#include <libxml/xmlregexp.h>
+#include <libxml/hash.h>
+#include <libxml/dict.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ XML_SCHEMAS_UNKNOWN = 0,
+ XML_SCHEMAS_STRING,
+ XML_SCHEMAS_NORMSTRING,
+ XML_SCHEMAS_DECIMAL,
+ XML_SCHEMAS_TIME,
+ XML_SCHEMAS_GDAY,
+ XML_SCHEMAS_GMONTH,
+ XML_SCHEMAS_GMONTHDAY,
+ XML_SCHEMAS_GYEAR,
+ XML_SCHEMAS_GYEARMONTH,
+ XML_SCHEMAS_DATE,
+ XML_SCHEMAS_DATETIME,
+ XML_SCHEMAS_DURATION,
+ XML_SCHEMAS_FLOAT,
+ XML_SCHEMAS_DOUBLE,
+ XML_SCHEMAS_BOOLEAN,
+ XML_SCHEMAS_TOKEN,
+ XML_SCHEMAS_LANGUAGE,
+ XML_SCHEMAS_NMTOKEN,
+ XML_SCHEMAS_NMTOKENS,
+ XML_SCHEMAS_NAME,
+ XML_SCHEMAS_QNAME,
+ XML_SCHEMAS_NCNAME,
+ XML_SCHEMAS_ID,
+ XML_SCHEMAS_IDREF,
+ XML_SCHEMAS_IDREFS,
+ XML_SCHEMAS_ENTITY,
+ XML_SCHEMAS_ENTITIES,
+ XML_SCHEMAS_NOTATION,
+ XML_SCHEMAS_ANYURI,
+ XML_SCHEMAS_INTEGER,
+ XML_SCHEMAS_NPINTEGER,
+ XML_SCHEMAS_NINTEGER,
+ XML_SCHEMAS_NNINTEGER,
+ XML_SCHEMAS_PINTEGER,
+ XML_SCHEMAS_INT,
+ XML_SCHEMAS_UINT,
+ XML_SCHEMAS_LONG,
+ XML_SCHEMAS_ULONG,
+ XML_SCHEMAS_SHORT,
+ XML_SCHEMAS_USHORT,
+ XML_SCHEMAS_BYTE,
+ XML_SCHEMAS_UBYTE,
+ XML_SCHEMAS_HEXBINARY,
+ XML_SCHEMAS_BASE64BINARY,
+ XML_SCHEMAS_ANYTYPE,
+ XML_SCHEMAS_ANYSIMPLETYPE
+} xmlSchemaValType;
+
+/*
+ * XML Schemas defines multiple type of types.
+ */
+typedef enum {
+ XML_SCHEMA_TYPE_BASIC = 1, /* A built-in datatype */
+ XML_SCHEMA_TYPE_ANY,
+ XML_SCHEMA_TYPE_FACET,
+ XML_SCHEMA_TYPE_SIMPLE,
+ XML_SCHEMA_TYPE_COMPLEX,
+ XML_SCHEMA_TYPE_SEQUENCE = 6,
+ XML_SCHEMA_TYPE_CHOICE,
+ XML_SCHEMA_TYPE_ALL,
+ XML_SCHEMA_TYPE_SIMPLE_CONTENT,
+ XML_SCHEMA_TYPE_COMPLEX_CONTENT,
+ XML_SCHEMA_TYPE_UR,
+ XML_SCHEMA_TYPE_RESTRICTION,
+ XML_SCHEMA_TYPE_EXTENSION,
+ XML_SCHEMA_TYPE_ELEMENT,
+ XML_SCHEMA_TYPE_ATTRIBUTE,
+ XML_SCHEMA_TYPE_ATTRIBUTEGROUP,
+ XML_SCHEMA_TYPE_GROUP,
+ XML_SCHEMA_TYPE_NOTATION,
+ XML_SCHEMA_TYPE_LIST,
+ XML_SCHEMA_TYPE_UNION,
+ XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
+ XML_SCHEMA_TYPE_IDC_UNIQUE,
+ XML_SCHEMA_TYPE_IDC_KEY,
+ XML_SCHEMA_TYPE_IDC_KEYREF,
+ XML_SCHEMA_TYPE_PARTICLE = 25,
+ XML_SCHEMA_TYPE_ATTRIBUTE_USE,
+ XML_SCHEMA_FACET_MININCLUSIVE = 1000,
+ XML_SCHEMA_FACET_MINEXCLUSIVE,
+ XML_SCHEMA_FACET_MAXINCLUSIVE,
+ XML_SCHEMA_FACET_MAXEXCLUSIVE,
+ XML_SCHEMA_FACET_TOTALDIGITS,
+ XML_SCHEMA_FACET_FRACTIONDIGITS,
+ XML_SCHEMA_FACET_PATTERN,
+ XML_SCHEMA_FACET_ENUMERATION,
+ XML_SCHEMA_FACET_WHITESPACE,
+ XML_SCHEMA_FACET_LENGTH,
+ XML_SCHEMA_FACET_MAXLENGTH,
+ XML_SCHEMA_FACET_MINLENGTH,
+ XML_SCHEMA_EXTRA_QNAMEREF = 2000,
+ XML_SCHEMA_EXTRA_ATTR_USE_PROHIB
+} xmlSchemaTypeType;
+
+typedef enum {
+ XML_SCHEMA_CONTENT_UNKNOWN = 0,
+ XML_SCHEMA_CONTENT_EMPTY = 1,
+ XML_SCHEMA_CONTENT_ELEMENTS,
+ XML_SCHEMA_CONTENT_MIXED,
+ XML_SCHEMA_CONTENT_SIMPLE,
+ XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS, /* Obsolete */
+ XML_SCHEMA_CONTENT_BASIC,
+ XML_SCHEMA_CONTENT_ANY
+} xmlSchemaContentType;
+
+typedef struct _xmlSchemaVal xmlSchemaVal;
+typedef xmlSchemaVal *xmlSchemaValPtr;
+
+typedef struct _xmlSchemaType xmlSchemaType;
+typedef xmlSchemaType *xmlSchemaTypePtr;
+
+typedef struct _xmlSchemaFacet xmlSchemaFacet;
+typedef xmlSchemaFacet *xmlSchemaFacetPtr;
+
+/**
+ * Annotation
+ */
+typedef struct _xmlSchemaAnnot xmlSchemaAnnot;
+typedef xmlSchemaAnnot *xmlSchemaAnnotPtr;
+struct _xmlSchemaAnnot {
+ struct _xmlSchemaAnnot *next;
+ xmlNodePtr content; /* the annotation */
+};
+
+/**
+ * XML_SCHEMAS_ANYATTR_SKIP:
+ *
+ * Skip unknown attribute from validation
+ * Obsolete, not used anymore.
+ */
+#define XML_SCHEMAS_ANYATTR_SKIP 1
+/**
+ * XML_SCHEMAS_ANYATTR_LAX:
+ *
+ * Ignore validation non definition on attributes
+ * Obsolete, not used anymore.
+ */
+#define XML_SCHEMAS_ANYATTR_LAX 2
+/**
+ * XML_SCHEMAS_ANYATTR_STRICT:
+ *
+ * Apply strict validation rules on attributes
+ * Obsolete, not used anymore.
+ */
+#define XML_SCHEMAS_ANYATTR_STRICT 3
+/**
+ * XML_SCHEMAS_ANY_SKIP:
+ *
+ * Skip unknown attribute from validation
+ */
+#define XML_SCHEMAS_ANY_SKIP 1
+/**
+ * XML_SCHEMAS_ANY_LAX:
+ *
+ * Used by wildcards.
+ * Validate if type found, don't worry if not found
+ */
+#define XML_SCHEMAS_ANY_LAX 2
+/**
+ * XML_SCHEMAS_ANY_STRICT:
+ *
+ * Used by wildcards.
+ * Apply strict validation rules
+ */
+#define XML_SCHEMAS_ANY_STRICT 3
+/**
+ * XML_SCHEMAS_ATTR_USE_PROHIBITED:
+ *
+ * Used by wildcards.
+ * The attribute is prohibited.
+ */
+#define XML_SCHEMAS_ATTR_USE_PROHIBITED 0
+/**
+ * XML_SCHEMAS_ATTR_USE_REQUIRED:
+ *
+ * The attribute is required.
+ */
+#define XML_SCHEMAS_ATTR_USE_REQUIRED 1
+/**
+ * XML_SCHEMAS_ATTR_USE_OPTIONAL:
+ *
+ * The attribute is optional.
+ */
+#define XML_SCHEMAS_ATTR_USE_OPTIONAL 2
+/**
+ * XML_SCHEMAS_ATTR_GLOBAL:
+ *
+ * allow elements in no namespace
+ */
+#define XML_SCHEMAS_ATTR_GLOBAL 1 << 0
+/**
+ * XML_SCHEMAS_ATTR_NSDEFAULT:
+ *
+ * allow elements in no namespace
+ */
+#define XML_SCHEMAS_ATTR_NSDEFAULT 1 << 7
+/**
+ * XML_SCHEMAS_ATTR_INTERNAL_RESOLVED:
+ *
+ * this is set when the "type" and "ref" references
+ * have been resolved.
+ */
+#define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED 1 << 8
+/**
+ * XML_SCHEMAS_ATTR_FIXED:
+ *
+ * the attribute has a fixed value
+ */
+#define XML_SCHEMAS_ATTR_FIXED 1 << 9
+
+/**
+ * xmlSchemaAttribute:
+ * An attribute definition.
+ */
+
+typedef struct _xmlSchemaAttribute xmlSchemaAttribute;
+typedef xmlSchemaAttribute *xmlSchemaAttributePtr;
+struct _xmlSchemaAttribute {
+ xmlSchemaTypeType type;
+ struct _xmlSchemaAttribute *next; /* the next attribute (not used?) */
+ const xmlChar *name; /* the name of the declaration */
+ const xmlChar *id; /* Deprecated; not used */
+ const xmlChar *ref; /* Deprecated; not used */
+ const xmlChar *refNs; /* Deprecated; not used */
+ const xmlChar *typeName; /* the local name of the type definition */
+ const xmlChar *typeNs; /* the ns URI of the type definition */
+ xmlSchemaAnnotPtr annot;
+
+ xmlSchemaTypePtr base; /* Deprecated; not used */
+ int occurs; /* Deprecated; not used */
+ const xmlChar *defValue; /* The initial value of the value constraint */
+ xmlSchemaTypePtr subtypes; /* the type definition */
+ xmlNodePtr node;
+ const xmlChar *targetNamespace;
+ int flags;
+ const xmlChar *refPrefix; /* Deprecated; not used */
+ xmlSchemaValPtr defVal; /* The compiled value constraint */
+ xmlSchemaAttributePtr refDecl; /* Deprecated; not used */
+};
+
+/**
+ * xmlSchemaAttributeLink:
+ * Used to build a list of attribute uses on complexType definitions.
+ * WARNING: Deprecated; not used.
+ */
+typedef struct _xmlSchemaAttributeLink xmlSchemaAttributeLink;
+typedef xmlSchemaAttributeLink *xmlSchemaAttributeLinkPtr;
+struct _xmlSchemaAttributeLink {
+ struct _xmlSchemaAttributeLink *next;/* the next attribute link ... */
+ struct _xmlSchemaAttribute *attr;/* the linked attribute */
+};
+
+/**
+ * XML_SCHEMAS_WILDCARD_COMPLETE:
+ *
+ * If the wildcard is complete.
+ */
+#define XML_SCHEMAS_WILDCARD_COMPLETE 1 << 0
+
+/**
+ * xmlSchemaCharValueLink:
+ * Used to build a list of namespaces on wildcards.
+ */
+typedef struct _xmlSchemaWildcardNs xmlSchemaWildcardNs;
+typedef xmlSchemaWildcardNs *xmlSchemaWildcardNsPtr;
+struct _xmlSchemaWildcardNs {
+ struct _xmlSchemaWildcardNs *next;/* the next constraint link ... */
+ const xmlChar *value;/* the value */
+};
+
+/**
+ * xmlSchemaWildcard.
+ * A wildcard.
+ */
+typedef struct _xmlSchemaWildcard xmlSchemaWildcard;
+typedef xmlSchemaWildcard *xmlSchemaWildcardPtr;
+struct _xmlSchemaWildcard {
+ xmlSchemaTypeType type; /* The kind of type */
+ const xmlChar *id; /* Deprecated; not used */
+ xmlSchemaAnnotPtr annot;
+ xmlNodePtr node;
+ int minOccurs; /* Deprecated; not used */
+ int maxOccurs; /* Deprecated; not used */
+ int processContents;
+ int any; /* Indicates if the ns constraint is of ##any */
+ xmlSchemaWildcardNsPtr nsSet; /* The list of allowed namespaces */
+ xmlSchemaWildcardNsPtr negNsSet; /* The negated namespace */
+ int flags;
+};
+
+/**
+ * XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED:
+ *
+ * The attribute wildcard has been already builded.
+ */
+#define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED 1 << 0
+/**
+ * XML_SCHEMAS_ATTRGROUP_GLOBAL:
+ *
+ * The attribute wildcard has been already builded.
+ */
+#define XML_SCHEMAS_ATTRGROUP_GLOBAL 1 << 1
+/**
+ * XML_SCHEMAS_ATTRGROUP_MARKED:
+ *
+ * Marks the attr group as marked; used for circular checks.
+ */
+#define XML_SCHEMAS_ATTRGROUP_MARKED 1 << 2
+
+/**
+ * XML_SCHEMAS_ATTRGROUP_REDEFINED:
+ *
+ * The attr group was redefined.
+ */
+#define XML_SCHEMAS_ATTRGROUP_REDEFINED 1 << 3
+/**
+ * XML_SCHEMAS_ATTRGROUP_HAS_REFS:
+ *
+ * Whether this attr. group contains attr. group references.
+ */
+#define XML_SCHEMAS_ATTRGROUP_HAS_REFS 1 << 4
+
+/**
+ * An attribute group definition.
+ *
+ * xmlSchemaAttribute and xmlSchemaAttributeGroup start of structures
+ * must be kept similar
+ */
+typedef struct _xmlSchemaAttributeGroup xmlSchemaAttributeGroup;
+typedef xmlSchemaAttributeGroup *xmlSchemaAttributeGroupPtr;
+struct _xmlSchemaAttributeGroup {
+ xmlSchemaTypeType type; /* The kind of type */
+ struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */
+ const xmlChar *name;
+ const xmlChar *id;
+ const xmlChar *ref; /* Deprecated; not used */
+ const xmlChar *refNs; /* Deprecated; not used */
+ xmlSchemaAnnotPtr annot;
+
+ xmlSchemaAttributePtr attributes; /* Deprecated; not used */
+ xmlNodePtr node;
+ int flags;
+ xmlSchemaWildcardPtr attributeWildcard;
+ const xmlChar *refPrefix; /* Deprecated; not used */
+ xmlSchemaAttributeGroupPtr refItem; /* Deprecated; not used */
+ const xmlChar *targetNamespace;
+ void *attrUses;
+};
+
+/**
+ * xmlSchemaTypeLink:
+ * Used to build a list of types (e.g. member types of
+ * simpleType with variety "union").
+ */
+typedef struct _xmlSchemaTypeLink xmlSchemaTypeLink;
+typedef xmlSchemaTypeLink *xmlSchemaTypeLinkPtr;
+struct _xmlSchemaTypeLink {
+ struct _xmlSchemaTypeLink *next;/* the next type link ... */
+ xmlSchemaTypePtr type;/* the linked type */
+};
+
+/**
+ * xmlSchemaFacetLink:
+ * Used to build a list of facets.
+ */
+typedef struct _xmlSchemaFacetLink xmlSchemaFacetLink;
+typedef xmlSchemaFacetLink *xmlSchemaFacetLinkPtr;
+struct _xmlSchemaFacetLink {
+ struct _xmlSchemaFacetLink *next;/* the next facet link ... */
+ xmlSchemaFacetPtr facet;/* the linked facet */
+};
+
+/**
+ * XML_SCHEMAS_TYPE_MIXED:
+ *
+ * the element content type is mixed
+ */
+#define XML_SCHEMAS_TYPE_MIXED 1 << 0
+/**
+ * XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION:
+ *
+ * the simple or complex type has a derivation method of "extension".
+ */
+#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION 1 << 1
+/**
+ * XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION:
+ *
+ * the simple or complex type has a derivation method of "restriction".
+ */
+#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION 1 << 2
+/**
+ * XML_SCHEMAS_TYPE_GLOBAL:
+ *
+ * the type is global
+ */
+#define XML_SCHEMAS_TYPE_GLOBAL 1 << 3
+/**
+ * XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD:
+ *
+ * the complexType owns an attribute wildcard, i.e.
+ * it can be freed by the complexType
+ */
+#define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD 1 << 4 /* Obsolete. */
+/**
+ * XML_SCHEMAS_TYPE_VARIETY_ABSENT:
+ *
+ * the simpleType has a variety of "absent".
+ * TODO: Actually not necessary :-/, since if
+ * none of the variety flags occur then it's
+ * automatically absent.
+ */
+#define XML_SCHEMAS_TYPE_VARIETY_ABSENT 1 << 5
+/**
+ * XML_SCHEMAS_TYPE_VARIETY_LIST:
+ *
+ * the simpleType has a variety of "list".
+ */
+#define XML_SCHEMAS_TYPE_VARIETY_LIST 1 << 6
+/**
+ * XML_SCHEMAS_TYPE_VARIETY_UNION:
+ *
+ * the simpleType has a variety of "union".
+ */
+#define XML_SCHEMAS_TYPE_VARIETY_UNION 1 << 7
+/**
+ * XML_SCHEMAS_TYPE_VARIETY_ATOMIC:
+ *
+ * the simpleType has a variety of "union".
+ */
+#define XML_SCHEMAS_TYPE_VARIETY_ATOMIC 1 << 8
+/**
+ * XML_SCHEMAS_TYPE_FINAL_EXTENSION:
+ *
+ * the complexType has a final of "extension".
+ */
+#define XML_SCHEMAS_TYPE_FINAL_EXTENSION 1 << 9
+/**
+ * XML_SCHEMAS_TYPE_FINAL_RESTRICTION:
+ *
+ * the simpleType/complexType has a final of "restriction".
+ */
+#define XML_SCHEMAS_TYPE_FINAL_RESTRICTION 1 << 10
+/**
+ * XML_SCHEMAS_TYPE_FINAL_LIST:
+ *
+ * the simpleType has a final of "list".
+ */
+#define XML_SCHEMAS_TYPE_FINAL_LIST 1 << 11
+/**
+ * XML_SCHEMAS_TYPE_FINAL_UNION:
+ *
+ * the simpleType has a final of "union".
+ */
+#define XML_SCHEMAS_TYPE_FINAL_UNION 1 << 12
+/**
+ * XML_SCHEMAS_TYPE_FINAL_DEFAULT:
+ *
+ * the simpleType has a final of "default".
+ */
+#define XML_SCHEMAS_TYPE_FINAL_DEFAULT 1 << 13
+/**
+ * XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE:
+ *
+ * Marks the item as a builtin primitive.
+ */
+#define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE 1 << 14
+/**
+ * XML_SCHEMAS_TYPE_MARKED:
+ *
+ * Marks the item as marked; used for circular checks.
+ */
+#define XML_SCHEMAS_TYPE_MARKED 1 << 16
+/**
+ * XML_SCHEMAS_TYPE_BLOCK_DEFAULT:
+ *
+ * the complexType did not specify 'block' so use the default of the
+ * <schema> item.
+ */
+#define XML_SCHEMAS_TYPE_BLOCK_DEFAULT 1 << 17
+/**
+ * XML_SCHEMAS_TYPE_BLOCK_EXTENSION:
+ *
+ * the complexType has a 'block' of "extension".
+ */
+#define XML_SCHEMAS_TYPE_BLOCK_EXTENSION 1 << 18
+/**
+ * XML_SCHEMAS_TYPE_BLOCK_RESTRICTION:
+ *
+ * the complexType has a 'block' of "restriction".
+ */
+#define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION 1 << 19
+/**
+ * XML_SCHEMAS_TYPE_ABSTRACT:
+ *
+ * the simple/complexType is abstract.
+ */
+#define XML_SCHEMAS_TYPE_ABSTRACT 1 << 20
+/**
+ * XML_SCHEMAS_TYPE_FACETSNEEDVALUE:
+ *
+ * indicates if the facets need a computed value
+ */
+#define XML_SCHEMAS_TYPE_FACETSNEEDVALUE 1 << 21
+/**
+ * XML_SCHEMAS_TYPE_INTERNAL_RESOLVED:
+ *
+ * indicates that the type was typefixed
+ */
+#define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED 1 << 22
+/**
+ * XML_SCHEMAS_TYPE_INTERNAL_INVALID:
+ *
+ * indicates that the type is invalid
+ */
+#define XML_SCHEMAS_TYPE_INTERNAL_INVALID 1 << 23
+/**
+ * XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE:
+ *
+ * a whitespace-facet value of "preserve"
+ */
+#define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE 1 << 24
+/**
+ * XML_SCHEMAS_TYPE_WHITESPACE_REPLACE:
+ *
+ * a whitespace-facet value of "replace"
+ */
+#define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE 1 << 25
+/**
+ * XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE:
+ *
+ * a whitespace-facet value of "collapse"
+ */
+#define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE 1 << 26
+/**
+ * XML_SCHEMAS_TYPE_HAS_FACETS:
+ *
+ * has facets
+ */
+#define XML_SCHEMAS_TYPE_HAS_FACETS 1 << 27
+/**
+ * XML_SCHEMAS_TYPE_NORMVALUENEEDED:
+ *
+ * indicates if the facets (pattern) need a normalized value
+ */
+#define XML_SCHEMAS_TYPE_NORMVALUENEEDED 1 << 28
+
+/**
+ * XML_SCHEMAS_TYPE_FIXUP_1:
+ *
+ * First stage of fixup was done.
+ */
+#define XML_SCHEMAS_TYPE_FIXUP_1 1 << 29
+
+/**
+ * XML_SCHEMAS_TYPE_REDEFINED:
+ *
+ * The type was redefined.
+ */
+#define XML_SCHEMAS_TYPE_REDEFINED 1 << 30
+/**
+ * XML_SCHEMAS_TYPE_REDEFINING:
+ *
+ * The type redefines an other type.
+ */
+/* #define XML_SCHEMAS_TYPE_REDEFINING 1 << 31 */
+
+/**
+ * _xmlSchemaType:
+ *
+ * Schemas type definition.
+ */
+struct _xmlSchemaType {
+ xmlSchemaTypeType type; /* The kind of type */
+ struct _xmlSchemaType *next; /* the next type if in a sequence ... */
+ const xmlChar *name;
+ const xmlChar *id ; /* Deprecated; not used */
+ const xmlChar *ref; /* Deprecated; not used */
+ const xmlChar *refNs; /* Deprecated; not used */
+ xmlSchemaAnnotPtr annot;
+ xmlSchemaTypePtr subtypes;
+ xmlSchemaAttributePtr attributes; /* Deprecated; not used */
+ xmlNodePtr node;
+ int minOccurs; /* Deprecated; not used */
+ int maxOccurs; /* Deprecated; not used */
+
+ int flags;
+ xmlSchemaContentType contentType;
+ const xmlChar *base; /* Base type's local name */
+ const xmlChar *baseNs; /* Base type's target namespace */
+ xmlSchemaTypePtr baseType; /* The base type component */
+ xmlSchemaFacetPtr facets; /* Local facets */
+ struct _xmlSchemaType *redef; /* Deprecated; not used */
+ int recurse; /* Obsolete */
+ xmlSchemaAttributeLinkPtr *attributeUses; /* Deprecated; not used */
+ xmlSchemaWildcardPtr attributeWildcard;
+ int builtInType; /* Type of built-in types. */
+ xmlSchemaTypeLinkPtr memberTypes; /* member-types if a union type. */
+ xmlSchemaFacetLinkPtr facetSet; /* All facets (incl. inherited) */
+ const xmlChar *refPrefix; /* Deprecated; not used */
+ xmlSchemaTypePtr contentTypeDef; /* Used for the simple content of complex types.
+ Could we use @subtypes for this? */
+ xmlRegexpPtr contModel; /* Holds the automaton of the content model */
+ const xmlChar *targetNamespace;
+ void *attrUses;
+};
+
+/*
+ * xmlSchemaElement:
+ * An element definition.
+ *
+ * xmlSchemaType, xmlSchemaFacet and xmlSchemaElement start of
+ * structures must be kept similar
+ */
+/**
+ * XML_SCHEMAS_ELEM_NILLABLE:
+ *
+ * the element is nillable
+ */
+#define XML_SCHEMAS_ELEM_NILLABLE 1 << 0
+/**
+ * XML_SCHEMAS_ELEM_GLOBAL:
+ *
+ * the element is global
+ */
+#define XML_SCHEMAS_ELEM_GLOBAL 1 << 1
+/**
+ * XML_SCHEMAS_ELEM_DEFAULT:
+ *
+ * the element has a default value
+ */
+#define XML_SCHEMAS_ELEM_DEFAULT 1 << 2
+/**
+ * XML_SCHEMAS_ELEM_FIXED:
+ *
+ * the element has a fixed value
+ */
+#define XML_SCHEMAS_ELEM_FIXED 1 << 3
+/**
+ * XML_SCHEMAS_ELEM_ABSTRACT:
+ *
+ * the element is abstract
+ */
+#define XML_SCHEMAS_ELEM_ABSTRACT 1 << 4
+/**
+ * XML_SCHEMAS_ELEM_TOPLEVEL:
+ *
+ * the element is top level
+ * obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead
+ */
+#define XML_SCHEMAS_ELEM_TOPLEVEL 1 << 5
+/**
+ * XML_SCHEMAS_ELEM_REF:
+ *
+ * the element is a reference to a type
+ */
+#define XML_SCHEMAS_ELEM_REF 1 << 6
+/**
+ * XML_SCHEMAS_ELEM_NSDEFAULT:
+ *
+ * allow elements in no namespace
+ * Obsolete, not used anymore.
+ */
+#define XML_SCHEMAS_ELEM_NSDEFAULT 1 << 7
+/**
+ * XML_SCHEMAS_ELEM_INTERNAL_RESOLVED:
+ *
+ * this is set when "type", "ref", "substitutionGroup"
+ * references have been resolved.
+ */
+#define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED 1 << 8
+ /**
+ * XML_SCHEMAS_ELEM_CIRCULAR:
+ *
+ * a helper flag for the search of circular references.
+ */
+#define XML_SCHEMAS_ELEM_CIRCULAR 1 << 9
+/**
+ * XML_SCHEMAS_ELEM_BLOCK_ABSENT:
+ *
+ * the "block" attribute is absent
+ */
+#define XML_SCHEMAS_ELEM_BLOCK_ABSENT 1 << 10
+/**
+ * XML_SCHEMAS_ELEM_BLOCK_EXTENSION:
+ *
+ * disallowed substitutions are absent
+ */
+#define XML_SCHEMAS_ELEM_BLOCK_EXTENSION 1 << 11
+/**
+ * XML_SCHEMAS_ELEM_BLOCK_RESTRICTION:
+ *
+ * disallowed substitutions: "restriction"
+ */
+#define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION 1 << 12
+/**
+ * XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION:
+ *
+ * disallowed substitutions: "substituion"
+ */
+#define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION 1 << 13
+/**
+ * XML_SCHEMAS_ELEM_FINAL_ABSENT:
+ *
+ * substitution group exclusions are absent
+ */
+#define XML_SCHEMAS_ELEM_FINAL_ABSENT 1 << 14
+/**
+ * XML_SCHEMAS_ELEM_FINAL_EXTENSION:
+ *
+ * substitution group exclusions: "extension"
+ */
+#define XML_SCHEMAS_ELEM_FINAL_EXTENSION 1 << 15
+/**
+ * XML_SCHEMAS_ELEM_FINAL_RESTRICTION:
+ *
+ * substitution group exclusions: "restriction"
+ */
+#define XML_SCHEMAS_ELEM_FINAL_RESTRICTION 1 << 16
+/**
+ * XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD:
+ *
+ * the declaration is a substitution group head
+ */
+#define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD 1 << 17
+/**
+ * XML_SCHEMAS_ELEM_INTERNAL_CHECKED:
+ *
+ * this is set when the elem decl has been checked against
+ * all constraints
+ */
+#define XML_SCHEMAS_ELEM_INTERNAL_CHECKED 1 << 18
+
+typedef struct _xmlSchemaElement xmlSchemaElement;
+typedef xmlSchemaElement *xmlSchemaElementPtr;
+struct _xmlSchemaElement {
+ xmlSchemaTypeType type; /* The kind of type */
+ struct _xmlSchemaType *next; /* Not used? */
+ const xmlChar *name;
+ const xmlChar *id; /* Deprecated; not used */
+ const xmlChar *ref; /* Deprecated; not used */
+ const xmlChar *refNs; /* Deprecated; not used */
+ xmlSchemaAnnotPtr annot;
+ xmlSchemaTypePtr subtypes; /* the type definition */
+ xmlSchemaAttributePtr attributes;
+ xmlNodePtr node;
+ int minOccurs; /* Deprecated; not used */
+ int maxOccurs; /* Deprecated; not used */
+
+ int flags;
+ const xmlChar *targetNamespace;
+ const xmlChar *namedType;
+ const xmlChar *namedTypeNs;
+ const xmlChar *substGroup;
+ const xmlChar *substGroupNs;
+ const xmlChar *scope;
+ const xmlChar *value; /* The original value of the value constraint. */
+ struct _xmlSchemaElement *refDecl; /* This will now be used for the
+ substitution group affiliation */
+ xmlRegexpPtr contModel; /* Obsolete for WXS, maybe used for RelaxNG */
+ xmlSchemaContentType contentType;
+ const xmlChar *refPrefix; /* Deprecated; not used */
+ xmlSchemaValPtr defVal; /* The compiled value contraint. */
+ void *idcs; /* The identity-constraint defs */
+};
+
+/*
+ * XML_SCHEMAS_FACET_UNKNOWN:
+ *
+ * unknown facet handling
+ */
+#define XML_SCHEMAS_FACET_UNKNOWN 0
+/*
+ * XML_SCHEMAS_FACET_PRESERVE:
+ *
+ * preserve the type of the facet
+ */
+#define XML_SCHEMAS_FACET_PRESERVE 1
+/*
+ * XML_SCHEMAS_FACET_REPLACE:
+ *
+ * replace the type of the facet
+ */
+#define XML_SCHEMAS_FACET_REPLACE 2
+/*
+ * XML_SCHEMAS_FACET_COLLAPSE:
+ *
+ * collapse the types of the facet
+ */
+#define XML_SCHEMAS_FACET_COLLAPSE 3
+/**
+ * A facet definition.
+ */
+struct _xmlSchemaFacet {
+ xmlSchemaTypeType type; /* The kind of type */
+ struct _xmlSchemaFacet *next;/* the next type if in a sequence ... */
+ const xmlChar *value; /* The original value */
+ const xmlChar *id; /* Obsolete */
+ xmlSchemaAnnotPtr annot;
+ xmlNodePtr node;
+ int fixed; /* XML_SCHEMAS_FACET_PRESERVE, etc. */
+ int whitespace;
+ xmlSchemaValPtr val; /* The compiled value */
+ xmlRegexpPtr regexp; /* The regex for patterns */
+};
+
+/**
+ * A notation definition.
+ */
+typedef struct _xmlSchemaNotation xmlSchemaNotation;
+typedef xmlSchemaNotation *xmlSchemaNotationPtr;
+struct _xmlSchemaNotation {
+ xmlSchemaTypeType type; /* The kind of type */
+ const xmlChar *name;
+ xmlSchemaAnnotPtr annot;
+ const xmlChar *identifier;
+ const xmlChar *targetNamespace;
+};
+
+/*
+* TODO: Actually all those flags used for the schema should sit
+* on the schema parser context, since they are used only
+* during parsing an XML schema document, and not available
+* on the component level as per spec.
+*/
+/**
+ * XML_SCHEMAS_QUALIF_ELEM:
+ *
+ * Reflects elementFormDefault == qualified in
+ * an XML schema document.
+ */
+#define XML_SCHEMAS_QUALIF_ELEM 1 << 0
+/**
+ * XML_SCHEMAS_QUALIF_ATTR:
+ *
+ * Reflects attributeFormDefault == qualified in
+ * an XML schema document.
+ */
+#define XML_SCHEMAS_QUALIF_ATTR 1 << 1
+/**
+ * XML_SCHEMAS_FINAL_DEFAULT_EXTENSION:
+ *
+ * the schema has "extension" in the set of finalDefault.
+ */
+#define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION 1 << 2
+/**
+ * XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION:
+ *
+ * the schema has "restriction" in the set of finalDefault.
+ */
+#define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION 1 << 3
+/**
+ * XML_SCHEMAS_FINAL_DEFAULT_LIST:
+ *
+ * the cshema has "list" in the set of finalDefault.
+ */
+#define XML_SCHEMAS_FINAL_DEFAULT_LIST 1 << 4
+/**
+ * XML_SCHEMAS_FINAL_DEFAULT_UNION:
+ *
+ * the schema has "union" in the set of finalDefault.
+ */
+#define XML_SCHEMAS_FINAL_DEFAULT_UNION 1 << 5
+/**
+ * XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION:
+ *
+ * the schema has "extension" in the set of blockDefault.
+ */
+#define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION 1 << 6
+/**
+ * XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION:
+ *
+ * the schema has "restriction" in the set of blockDefault.
+ */
+#define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION 1 << 7
+/**
+ * XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION:
+ *
+ * the schema has "substitution" in the set of blockDefault.
+ */
+#define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION 1 << 8
+/**
+ * XML_SCHEMAS_INCLUDING_CONVERT_NS:
+ *
+ * the schema is currently including an other schema with
+ * no target namespace.
+ */
+#define XML_SCHEMAS_INCLUDING_CONVERT_NS 1 << 9
+/**
+ * _xmlSchema:
+ *
+ * A Schemas definition
+ */
+struct _xmlSchema {
+ const xmlChar *name; /* schema name */
+ const xmlChar *targetNamespace; /* the target namespace */
+ const xmlChar *version;
+ const xmlChar *id; /* Obsolete */
+ xmlDocPtr doc;
+ xmlSchemaAnnotPtr annot;
+ int flags;
+
+ xmlHashTablePtr typeDecl;
+ xmlHashTablePtr attrDecl;
+ xmlHashTablePtr attrgrpDecl;
+ xmlHashTablePtr elemDecl;
+ xmlHashTablePtr notaDecl;
+
+ xmlHashTablePtr schemasImports;
+
+ void *_private; /* unused by the library for users or bindings */
+ xmlHashTablePtr groupDecl;
+ xmlDictPtr dict;
+ void *includes; /* the includes, this is opaque for now */
+ int preserve; /* whether to free the document */
+ int counter; /* used to give ononymous components unique names */
+ xmlHashTablePtr idcDef; /* All identity-constraint defs. */
+ void *volatiles; /* Obsolete */
+};
+
+XMLPUBFUN void XMLCALL xmlSchemaFreeType (xmlSchemaTypePtr type);
+XMLPUBFUN void XMLCALL xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_SCHEMAS_ENABLED */
+#endif /* __XML_SCHEMA_INTERNALS_H__ */
--- /dev/null
+/*
+ * Summary: XML Schemastron implementation
+ * Description: interface to the XML Schematron validity checking.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SCHEMATRON_H__
+#define __XML_SCHEMATRON_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_SCHEMATRON_ENABLED
+
+#include <libxml/tree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ XML_SCHEMATRON_OUT_QUIET = 1 << 0, /* quiet no report */
+ XML_SCHEMATRON_OUT_TEXT = 1 << 1, /* build a textual report */
+ XML_SCHEMATRON_OUT_XML = 1 << 2, /* output SVRL */
+ XML_SCHEMATRON_OUT_ERROR = 1 << 3, /* output via xmlStructuredErrorFunc */
+ XML_SCHEMATRON_OUT_FILE = 1 << 8, /* output to a file descriptor */
+ XML_SCHEMATRON_OUT_BUFFER = 1 << 9, /* output to a buffer */
+ XML_SCHEMATRON_OUT_IO = 1 << 10 /* output to I/O mechanism */
+} xmlSchematronValidOptions;
+
+/**
+ * The schemas related types are kept internal
+ */
+typedef struct _xmlSchematron xmlSchematron;
+typedef xmlSchematron *xmlSchematronPtr;
+
+/**
+ * xmlSchematronValidityErrorFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of an error callback from a Schematron validation
+ */
+typedef void (*xmlSchematronValidityErrorFunc) (void *ctx, const char *msg, ...);
+
+/**
+ * xmlSchematronValidityWarningFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of a warning callback from a Schematron validation
+ */
+typedef void (*xmlSchematronValidityWarningFunc) (void *ctx, const char *msg, ...);
+
+/**
+ * A schemas validation context
+ */
+typedef struct _xmlSchematronParserCtxt xmlSchematronParserCtxt;
+typedef xmlSchematronParserCtxt *xmlSchematronParserCtxtPtr;
+
+typedef struct _xmlSchematronValidCtxt xmlSchematronValidCtxt;
+typedef xmlSchematronValidCtxt *xmlSchematronValidCtxtPtr;
+
+/*
+ * Interfaces for parsing.
+ */
+XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL
+ xmlSchematronNewParserCtxt (const char *URL);
+XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL
+ xmlSchematronNewMemParserCtxt(const char *buffer,
+ int size);
+XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL
+ xmlSchematronNewDocParserCtxt(xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlSchematronFreeParserCtxt (xmlSchematronParserCtxtPtr ctxt);
+/*****
+XMLPUBFUN void XMLCALL
+ xmlSchematronSetParserErrors(xmlSchematronParserCtxtPtr ctxt,
+ xmlSchematronValidityErrorFunc err,
+ xmlSchematronValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchematronGetParserErrors(xmlSchematronParserCtxtPtr ctxt,
+ xmlSchematronValidityErrorFunc * err,
+ xmlSchematronValidityWarningFunc * warn,
+ void **ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchematronIsValid (xmlSchematronValidCtxtPtr ctxt);
+ *****/
+XMLPUBFUN xmlSchematronPtr XMLCALL
+ xmlSchematronParse (xmlSchematronParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlSchematronFree (xmlSchematronPtr schema);
+/*
+ * Interfaces for validating
+ */
+XMLPUBFUN void XMLCALL
+ xmlSchematronSetValidStructuredErrors(
+ xmlSchematronValidCtxtPtr ctxt,
+ xmlStructuredErrorFunc serror,
+ void *ctx);
+/******
+XMLPUBFUN void XMLCALL
+ xmlSchematronSetValidErrors (xmlSchematronValidCtxtPtr ctxt,
+ xmlSchematronValidityErrorFunc err,
+ xmlSchematronValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchematronGetValidErrors (xmlSchematronValidCtxtPtr ctxt,
+ xmlSchematronValidityErrorFunc *err,
+ xmlSchematronValidityWarningFunc *warn,
+ void **ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchematronSetValidOptions(xmlSchematronValidCtxtPtr ctxt,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlSchematronValidCtxtGetOptions(xmlSchematronValidCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlSchematronValidateOneElement (xmlSchematronValidCtxtPtr ctxt,
+ xmlNodePtr elem);
+ *******/
+
+XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL
+ xmlSchematronNewValidCtxt (xmlSchematronPtr schema,
+ int options);
+XMLPUBFUN void XMLCALL
+ xmlSchematronFreeValidCtxt (xmlSchematronValidCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlSchematronValidateDoc (xmlSchematronValidCtxtPtr ctxt,
+ xmlDocPtr instance);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_SCHEMATRON_ENABLED */
+#endif /* __XML_SCHEMATRON_H__ */
--- /dev/null
+/**
+ * Summary: interfaces for thread handling
+ * Description: set of generic threading related routines
+ * should work with pthreads, Windows native or TLS threads
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_THREADS_H__
+#define __XML_THREADS_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * xmlMutex are a simple mutual exception locks.
+ */
+typedef struct _xmlMutex xmlMutex;
+typedef xmlMutex *xmlMutexPtr;
+
+/*
+ * xmlRMutex are reentrant mutual exception locks.
+ */
+typedef struct _xmlRMutex xmlRMutex;
+typedef xmlRMutex *xmlRMutexPtr;
+
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/globals.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+XMLPUBFUN xmlMutexPtr XMLCALL
+ xmlNewMutex (void);
+XMLPUBFUN void XMLCALL
+ xmlMutexLock (xmlMutexPtr tok);
+XMLPUBFUN void XMLCALL
+ xmlMutexUnlock (xmlMutexPtr tok);
+XMLPUBFUN void XMLCALL
+ xmlFreeMutex (xmlMutexPtr tok);
+
+XMLPUBFUN xmlRMutexPtr XMLCALL
+ xmlNewRMutex (void);
+XMLPUBFUN void XMLCALL
+ xmlRMutexLock (xmlRMutexPtr tok);
+XMLPUBFUN void XMLCALL
+ xmlRMutexUnlock (xmlRMutexPtr tok);
+XMLPUBFUN void XMLCALL
+ xmlFreeRMutex (xmlRMutexPtr tok);
+
+/*
+ * Library wide APIs.
+ */
+XMLPUBFUN void XMLCALL
+ xmlInitThreads (void);
+XMLPUBFUN void XMLCALL
+ xmlLockLibrary (void);
+XMLPUBFUN void XMLCALL
+ xmlUnlockLibrary(void);
+XMLPUBFUN int XMLCALL
+ xmlGetThreadId (void);
+XMLPUBFUN int XMLCALL
+ xmlIsMainThread (void);
+XMLPUBFUN void XMLCALL
+ xmlCleanupThreads(void);
+XMLPUBFUN xmlGlobalStatePtr XMLCALL
+ xmlGetGlobalState(void);
+
+#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && defined(LIBXML_STATIC_FOR_DLL)
+int XMLCALL xmlDllMain(void *hinstDLL, unsigned long fdwReason, void *lpvReserved);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __XML_THREADS_H__ */
--- /dev/null
+/*
+ * Summary: interfaces for tree manipulation
+ * Description: this module describes the structures found in an tree resulting
+ * from an XML or HTML parsing, as well as the API provided for
+ * various processing on that tree
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_TREE_H__
+#define __XML_TREE_H__
+
+#include <stdio.h>
+#include <limits.h>
+#include <libxml/xmlversion.h>
+#include <libxml/xmlstring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Some of the basic types pointer to structures:
+ */
+/* xmlIO.h */
+typedef struct _xmlParserInputBuffer xmlParserInputBuffer;
+typedef xmlParserInputBuffer *xmlParserInputBufferPtr;
+
+typedef struct _xmlOutputBuffer xmlOutputBuffer;
+typedef xmlOutputBuffer *xmlOutputBufferPtr;
+
+/* parser.h */
+typedef struct _xmlParserInput xmlParserInput;
+typedef xmlParserInput *xmlParserInputPtr;
+
+typedef struct _xmlParserCtxt xmlParserCtxt;
+typedef xmlParserCtxt *xmlParserCtxtPtr;
+
+typedef struct _xmlSAXLocator xmlSAXLocator;
+typedef xmlSAXLocator *xmlSAXLocatorPtr;
+
+typedef struct _xmlSAXHandler xmlSAXHandler;
+typedef xmlSAXHandler *xmlSAXHandlerPtr;
+
+/* entities.h */
+typedef struct _xmlEntity xmlEntity;
+typedef xmlEntity *xmlEntityPtr;
+
+/**
+ * BASE_BUFFER_SIZE:
+ *
+ * default buffer size 4000.
+ */
+#define BASE_BUFFER_SIZE 4096
+
+/**
+ * LIBXML_NAMESPACE_DICT:
+ *
+ * Defines experimental behaviour:
+ * 1) xmlNs gets an additional field @context (a xmlDoc)
+ * 2) when creating a tree, xmlNs->href is stored in the dict of xmlDoc.
+ */
+/* #define LIBXML_NAMESPACE_DICT */
+
+/**
+ * xmlBufferAllocationScheme:
+ *
+ * A buffer allocation scheme can be defined to either match exactly the
+ * need or double it's allocated size each time it is found too small.
+ */
+
+typedef enum {
+ XML_BUFFER_ALLOC_DOUBLEIT, /* double each time one need to grow */
+ XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */
+ XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */
+ XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */
+ XML_BUFFER_ALLOC_HYBRID /* exact up to a threshold, and doubleit thereafter */
+} xmlBufferAllocationScheme;
+
+/**
+ * xmlBuffer:
+ *
+ * A buffer structure, this old construct is limited to 2GB and
+ * is being deprecated, use API with xmlBuf instead
+ */
+typedef struct _xmlBuffer xmlBuffer;
+typedef xmlBuffer *xmlBufferPtr;
+struct _xmlBuffer {
+ xmlChar *content; /* The buffer content UTF8 */
+ unsigned int use; /* The buffer size used */
+ unsigned int size; /* The buffer size */
+ xmlBufferAllocationScheme alloc; /* The realloc method */
+ xmlChar *contentIO; /* in IO mode we may have a different base */
+};
+
+/**
+ * xmlBuf:
+ *
+ * A buffer structure, new one, the actual structure internals are not public
+ */
+
+typedef struct _xmlBuf xmlBuf;
+
+/**
+ * xmlBufPtr:
+ *
+ * A pointer to a buffer structure, the actual structure internals are not
+ * public
+ */
+
+typedef xmlBuf *xmlBufPtr;
+
+/*
+ * A few public routines for xmlBuf. As those are expected to be used
+ * mostly internally the bulk of the routines are internal in buf.h
+ */
+XMLPUBFUN xmlChar* XMLCALL xmlBufContent (const xmlBufPtr buf);
+XMLPUBFUN xmlChar* XMLCALL xmlBufEnd (const xmlBufPtr buf);
+XMLPUBFUN size_t XMLCALL xmlBufUse (const xmlBufPtr buf);
+XMLPUBFUN size_t XMLCALL xmlBufShrink (xmlBufPtr buf, size_t len);
+
+/*
+ * LIBXML2_NEW_BUFFER:
+ *
+ * Macro used to express that the API use the new buffers for
+ * xmlParserInputBuffer and xmlOutputBuffer. The change was
+ * introduced in 2.9.0.
+ */
+#define LIBXML2_NEW_BUFFER
+
+/**
+ * XML_XML_NAMESPACE:
+ *
+ * This is the namespace for the special xml: prefix predefined in the
+ * XML Namespace specification.
+ */
+#define XML_XML_NAMESPACE \
+ (const xmlChar *) "http://www.w3.org/XML/1998/namespace"
+
+/**
+ * XML_XML_ID:
+ *
+ * This is the name for the special xml:id attribute
+ */
+#define XML_XML_ID (const xmlChar *) "xml:id"
+
+/*
+ * The different element types carried by an XML tree.
+ *
+ * NOTE: This is synchronized with DOM Level1 values
+ * See http://www.w3.org/TR/REC-DOM-Level-1/
+ *
+ * Actually this had diverged a bit, and now XML_DOCUMENT_TYPE_NODE should
+ * be deprecated to use an XML_DTD_NODE.
+ */
+typedef enum {
+ XML_ELEMENT_NODE= 1,
+ XML_ATTRIBUTE_NODE= 2,
+ XML_TEXT_NODE= 3,
+ XML_CDATA_SECTION_NODE= 4,
+ XML_ENTITY_REF_NODE= 5,
+ XML_ENTITY_NODE= 6,
+ XML_PI_NODE= 7,
+ XML_COMMENT_NODE= 8,
+ XML_DOCUMENT_NODE= 9,
+ XML_DOCUMENT_TYPE_NODE= 10,
+ XML_DOCUMENT_FRAG_NODE= 11,
+ XML_NOTATION_NODE= 12,
+ XML_HTML_DOCUMENT_NODE= 13,
+ XML_DTD_NODE= 14,
+ XML_ELEMENT_DECL= 15,
+ XML_ATTRIBUTE_DECL= 16,
+ XML_ENTITY_DECL= 17,
+ XML_NAMESPACE_DECL= 18,
+ XML_XINCLUDE_START= 19,
+ XML_XINCLUDE_END= 20
+#ifdef LIBXML_DOCB_ENABLED
+ ,XML_DOCB_DOCUMENT_NODE= 21
+#endif
+} xmlElementType;
+
+
+/**
+ * xmlNotation:
+ *
+ * A DTD Notation definition.
+ */
+
+typedef struct _xmlNotation xmlNotation;
+typedef xmlNotation *xmlNotationPtr;
+struct _xmlNotation {
+ const xmlChar *name; /* Notation name */
+ const xmlChar *PublicID; /* Public identifier, if any */
+ const xmlChar *SystemID; /* System identifier, if any */
+};
+
+/**
+ * xmlAttributeType:
+ *
+ * A DTD Attribute type definition.
+ */
+
+typedef enum {
+ XML_ATTRIBUTE_CDATA = 1,
+ XML_ATTRIBUTE_ID,
+ XML_ATTRIBUTE_IDREF ,
+ XML_ATTRIBUTE_IDREFS,
+ XML_ATTRIBUTE_ENTITY,
+ XML_ATTRIBUTE_ENTITIES,
+ XML_ATTRIBUTE_NMTOKEN,
+ XML_ATTRIBUTE_NMTOKENS,
+ XML_ATTRIBUTE_ENUMERATION,
+ XML_ATTRIBUTE_NOTATION
+} xmlAttributeType;
+
+/**
+ * xmlAttributeDefault:
+ *
+ * A DTD Attribute default definition.
+ */
+
+typedef enum {
+ XML_ATTRIBUTE_NONE = 1,
+ XML_ATTRIBUTE_REQUIRED,
+ XML_ATTRIBUTE_IMPLIED,
+ XML_ATTRIBUTE_FIXED
+} xmlAttributeDefault;
+
+/**
+ * xmlEnumeration:
+ *
+ * List structure used when there is an enumeration in DTDs.
+ */
+
+typedef struct _xmlEnumeration xmlEnumeration;
+typedef xmlEnumeration *xmlEnumerationPtr;
+struct _xmlEnumeration {
+ struct _xmlEnumeration *next; /* next one */
+ const xmlChar *name; /* Enumeration name */
+};
+
+/**
+ * xmlAttribute:
+ *
+ * An Attribute declaration in a DTD.
+ */
+
+typedef struct _xmlAttribute xmlAttribute;
+typedef xmlAttribute *xmlAttributePtr;
+struct _xmlAttribute {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_ATTRIBUTE_DECL, must be second ! */
+ const xmlChar *name; /* Attribute name */
+ struct _xmlNode *children; /* NULL */
+ struct _xmlNode *last; /* NULL */
+ struct _xmlDtd *parent; /* -> DTD */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+
+ struct _xmlAttribute *nexth; /* next in hash table */
+ xmlAttributeType atype; /* The attribute type */
+ xmlAttributeDefault def; /* the default */
+ const xmlChar *defaultValue; /* or the default value */
+ xmlEnumerationPtr tree; /* or the enumeration tree if any */
+ const xmlChar *prefix; /* the namespace prefix if any */
+ const xmlChar *elem; /* Element holding the attribute */
+};
+
+/**
+ * xmlElementContentType:
+ *
+ * Possible definitions of element content types.
+ */
+typedef enum {
+ XML_ELEMENT_CONTENT_PCDATA = 1,
+ XML_ELEMENT_CONTENT_ELEMENT,
+ XML_ELEMENT_CONTENT_SEQ,
+ XML_ELEMENT_CONTENT_OR
+} xmlElementContentType;
+
+/**
+ * xmlElementContentOccur:
+ *
+ * Possible definitions of element content occurrences.
+ */
+typedef enum {
+ XML_ELEMENT_CONTENT_ONCE = 1,
+ XML_ELEMENT_CONTENT_OPT,
+ XML_ELEMENT_CONTENT_MULT,
+ XML_ELEMENT_CONTENT_PLUS
+} xmlElementContentOccur;
+
+/**
+ * xmlElementContent:
+ *
+ * An XML Element content as stored after parsing an element definition
+ * in a DTD.
+ */
+
+typedef struct _xmlElementContent xmlElementContent;
+typedef xmlElementContent *xmlElementContentPtr;
+struct _xmlElementContent {
+ xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */
+ xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */
+ const xmlChar *name; /* Element name */
+ struct _xmlElementContent *c1; /* first child */
+ struct _xmlElementContent *c2; /* second child */
+ struct _xmlElementContent *parent; /* parent */
+ const xmlChar *prefix; /* Namespace prefix */
+};
+
+/**
+ * xmlElementTypeVal:
+ *
+ * The different possibilities for an element content type.
+ */
+
+typedef enum {
+ XML_ELEMENT_TYPE_UNDEFINED = 0,
+ XML_ELEMENT_TYPE_EMPTY = 1,
+ XML_ELEMENT_TYPE_ANY,
+ XML_ELEMENT_TYPE_MIXED,
+ XML_ELEMENT_TYPE_ELEMENT
+} xmlElementTypeVal;
+
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/xmlregexp.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlElement:
+ *
+ * An XML Element declaration from a DTD.
+ */
+
+typedef struct _xmlElement xmlElement;
+typedef xmlElement *xmlElementPtr;
+struct _xmlElement {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_ELEMENT_DECL, must be second ! */
+ const xmlChar *name; /* Element name */
+ struct _xmlNode *children; /* NULL */
+ struct _xmlNode *last; /* NULL */
+ struct _xmlDtd *parent; /* -> DTD */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+
+ xmlElementTypeVal etype; /* The type */
+ xmlElementContentPtr content; /* the allowed element content */
+ xmlAttributePtr attributes; /* List of the declared attributes */
+ const xmlChar *prefix; /* the namespace prefix if any */
+#ifdef LIBXML_REGEXP_ENABLED
+ xmlRegexpPtr contModel; /* the validating regexp */
+#else
+ void *contModel;
+#endif
+};
+
+
+/**
+ * XML_LOCAL_NAMESPACE:
+ *
+ * A namespace declaration node.
+ */
+#define XML_LOCAL_NAMESPACE XML_NAMESPACE_DECL
+typedef xmlElementType xmlNsType;
+
+/**
+ * xmlNs:
+ *
+ * An XML namespace.
+ * Note that prefix == NULL is valid, it defines the default namespace
+ * within the subtree (until overridden).
+ *
+ * xmlNsType is unified with xmlElementType.
+ */
+
+typedef struct _xmlNs xmlNs;
+typedef xmlNs *xmlNsPtr;
+struct _xmlNs {
+ struct _xmlNs *next; /* next Ns link for this node */
+ xmlNsType type; /* global or local */
+ const xmlChar *href; /* URL for the namespace */
+ const xmlChar *prefix; /* prefix for the namespace */
+ void *_private; /* application data */
+ struct _xmlDoc *context; /* normally an xmlDoc */
+};
+
+/**
+ * xmlDtd:
+ *
+ * An XML DTD, as defined by <!DOCTYPE ... There is actually one for
+ * the internal subset and for the external subset.
+ */
+typedef struct _xmlDtd xmlDtd;
+typedef xmlDtd *xmlDtdPtr;
+struct _xmlDtd {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_DTD_NODE, must be second ! */
+ const xmlChar *name; /* Name of the DTD */
+ struct _xmlNode *children; /* the value of the property link */
+ struct _xmlNode *last; /* last child link */
+ struct _xmlDoc *parent; /* child->parent link */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+
+ /* End of common part */
+ void *notations; /* Hash table for notations if any */
+ void *elements; /* Hash table for elements if any */
+ void *attributes; /* Hash table for attributes if any */
+ void *entities; /* Hash table for entities if any */
+ const xmlChar *ExternalID; /* External identifier for PUBLIC DTD */
+ const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC DTD */
+ void *pentities; /* Hash table for param entities if any */
+};
+
+/**
+ * xmlAttr:
+ *
+ * An attribute on an XML node.
+ */
+typedef struct _xmlAttr xmlAttr;
+typedef xmlAttr *xmlAttrPtr;
+struct _xmlAttr {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_ATTRIBUTE_NODE, must be second ! */
+ const xmlChar *name; /* the name of the property */
+ struct _xmlNode *children; /* the value of the property */
+ struct _xmlNode *last; /* NULL */
+ struct _xmlNode *parent; /* child->parent link */
+ struct _xmlAttr *next; /* next sibling link */
+ struct _xmlAttr *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+ xmlNs *ns; /* pointer to the associated namespace */
+ xmlAttributeType atype; /* the attribute type if validating */
+ void *psvi; /* for type/PSVI informations */
+};
+
+/**
+ * xmlID:
+ *
+ * An XML ID instance.
+ */
+
+typedef struct _xmlID xmlID;
+typedef xmlID *xmlIDPtr;
+struct _xmlID {
+ struct _xmlID *next; /* next ID */
+ const xmlChar *value; /* The ID name */
+ xmlAttrPtr attr; /* The attribute holding it */
+ const xmlChar *name; /* The attribute if attr is not available */
+ int lineno; /* The line number if attr is not available */
+ struct _xmlDoc *doc; /* The document holding the ID */
+};
+
+/**
+ * xmlRef:
+ *
+ * An XML IDREF instance.
+ */
+
+typedef struct _xmlRef xmlRef;
+typedef xmlRef *xmlRefPtr;
+struct _xmlRef {
+ struct _xmlRef *next; /* next Ref */
+ const xmlChar *value; /* The Ref name */
+ xmlAttrPtr attr; /* The attribute holding it */
+ const xmlChar *name; /* The attribute if attr is not available */
+ int lineno; /* The line number if attr is not available */
+};
+
+/**
+ * xmlNode:
+ *
+ * A node in an XML tree.
+ */
+typedef struct _xmlNode xmlNode;
+typedef xmlNode *xmlNodePtr;
+struct _xmlNode {
+ void *_private; /* application data */
+ xmlElementType type; /* type number, must be second ! */
+ const xmlChar *name; /* the name of the node, or the entity */
+ struct _xmlNode *children; /* parent->childs link */
+ struct _xmlNode *last; /* last child link */
+ struct _xmlNode *parent; /* child->parent link */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* the containing document */
+
+ /* End of common part */
+ xmlNs *ns; /* pointer to the associated namespace */
+ xmlChar *content; /* the content */
+ struct _xmlAttr *properties;/* properties list */
+ xmlNs *nsDef; /* namespace definitions on this node */
+ void *psvi; /* for type/PSVI informations */
+ unsigned short line; /* line number */
+ unsigned short extra; /* extra data for XPath/XSLT */
+};
+
+/**
+ * XML_GET_CONTENT:
+ *
+ * Macro to extract the content pointer of a node.
+ */
+#define XML_GET_CONTENT(n) \
+ ((n)->type == XML_ELEMENT_NODE ? NULL : (n)->content)
+
+/**
+ * XML_GET_LINE:
+ *
+ * Macro to extract the line number of an element node.
+ */
+#define XML_GET_LINE(n) \
+ (xmlGetLineNo(n))
+
+/**
+ * xmlDocProperty
+ *
+ * Set of properties of the document as found by the parser
+ * Some of them are linked to similary named xmlParserOption
+ */
+typedef enum {
+ XML_DOC_WELLFORMED = 1<<0, /* document is XML well formed */
+ XML_DOC_NSVALID = 1<<1, /* document is Namespace valid */
+ XML_DOC_OLD10 = 1<<2, /* parsed with old XML-1.0 parser */
+ XML_DOC_DTDVALID = 1<<3, /* DTD validation was successful */
+ XML_DOC_XINCLUDE = 1<<4, /* XInclude substitution was done */
+ XML_DOC_USERBUILT = 1<<5, /* Document was built using the API
+ and not by parsing an instance */
+ XML_DOC_INTERNAL = 1<<6, /* built for internal processing */
+ XML_DOC_HTML = 1<<7 /* parsed or built HTML document */
+} xmlDocProperties;
+
+/**
+ * xmlDoc:
+ *
+ * An XML document.
+ */
+typedef struct _xmlDoc xmlDoc;
+typedef xmlDoc *xmlDocPtr;
+struct _xmlDoc {
+ void *_private; /* application data */
+ xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */
+ char *name; /* name/filename/URI of the document */
+ struct _xmlNode *children; /* the document tree */
+ struct _xmlNode *last; /* last child link */
+ struct _xmlNode *parent; /* child->parent link */
+ struct _xmlNode *next; /* next sibling link */
+ struct _xmlNode *prev; /* previous sibling link */
+ struct _xmlDoc *doc; /* autoreference to itself */
+
+ /* End of common part */
+ int compression;/* level of zlib compression */
+ int standalone; /* standalone document (no external refs)
+ 1 if standalone="yes"
+ 0 if standalone="no"
+ -1 if there is no XML declaration
+ -2 if there is an XML declaration, but no
+ standalone attribute was specified */
+ struct _xmlDtd *intSubset; /* the document internal subset */
+ struct _xmlDtd *extSubset; /* the document external subset */
+ struct _xmlNs *oldNs; /* Global namespace, the old way */
+ const xmlChar *version; /* the XML version string */
+ const xmlChar *encoding; /* external initial encoding, if any */
+ void *ids; /* Hash table for ID attributes if any */
+ void *refs; /* Hash table for IDREFs attributes if any */
+ const xmlChar *URL; /* The URI for that document */
+ int charset; /* encoding of the in-memory content
+ actually an xmlCharEncoding */
+ struct _xmlDict *dict; /* dict used to allocate names or NULL */
+ void *psvi; /* for type/PSVI informations */
+ int parseFlags; /* set of xmlParserOption used to parse the
+ document */
+ int properties; /* set of xmlDocProperties for this document
+ set at the end of parsing */
+};
+
+
+typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt;
+typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr;
+
+/**
+ * xmlDOMWrapAcquireNsFunction:
+ * @ctxt: a DOM wrapper context
+ * @node: the context node (element or attribute)
+ * @nsName: the requested namespace name
+ * @nsPrefix: the requested namespace prefix
+ *
+ * A function called to acquire namespaces (xmlNs) from the wrapper.
+ *
+ * Returns an xmlNsPtr or NULL in case of an error.
+ */
+typedef xmlNsPtr (*xmlDOMWrapAcquireNsFunction) (xmlDOMWrapCtxtPtr ctxt,
+ xmlNodePtr node,
+ const xmlChar *nsName,
+ const xmlChar *nsPrefix);
+
+/**
+ * xmlDOMWrapCtxt:
+ *
+ * Context for DOM wrapper-operations.
+ */
+struct _xmlDOMWrapCtxt {
+ void * _private;
+ /*
+ * The type of this context, just in case we need specialized
+ * contexts in the future.
+ */
+ int type;
+ /*
+ * Internal namespace map used for various operations.
+ */
+ void * namespaceMap;
+ /*
+ * Use this one to acquire an xmlNsPtr intended for node->ns.
+ * (Note that this is not intended for elem->nsDef).
+ */
+ xmlDOMWrapAcquireNsFunction getNsForNodeFunc;
+};
+
+/**
+ * xmlChildrenNode:
+ *
+ * Macro for compatibility naming layer with libxml1. Maps
+ * to "children."
+ */
+#ifndef xmlChildrenNode
+#define xmlChildrenNode children
+#endif
+
+/**
+ * xmlRootNode:
+ *
+ * Macro for compatibility naming layer with libxml1. Maps
+ * to "children".
+ */
+#ifndef xmlRootNode
+#define xmlRootNode children
+#endif
+
+/*
+ * Variables.
+ */
+
+/*
+ * Some helper functions
+ */
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED)
+XMLPUBFUN int XMLCALL
+ xmlValidateNCName (const xmlChar *value,
+ int space);
+#endif
+
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN int XMLCALL
+ xmlValidateQName (const xmlChar *value,
+ int space);
+XMLPUBFUN int XMLCALL
+ xmlValidateName (const xmlChar *value,
+ int space);
+XMLPUBFUN int XMLCALL
+ xmlValidateNMToken (const xmlChar *value,
+ int space);
+#endif
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlBuildQName (const xmlChar *ncname,
+ const xmlChar *prefix,
+ xmlChar *memory,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlSplitQName2 (const xmlChar *name,
+ xmlChar **prefix);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlSplitQName3 (const xmlChar *name,
+ int *len);
+
+/*
+ * Handling Buffers, the old ones see @xmlBuf for the new ones.
+ */
+
+XMLPUBFUN void XMLCALL
+ xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme);
+XMLPUBFUN xmlBufferAllocationScheme XMLCALL
+ xmlGetBufferAllocationScheme(void);
+
+XMLPUBFUN xmlBufferPtr XMLCALL
+ xmlBufferCreate (void);
+XMLPUBFUN xmlBufferPtr XMLCALL
+ xmlBufferCreateSize (size_t size);
+XMLPUBFUN xmlBufferPtr XMLCALL
+ xmlBufferCreateStatic (void *mem,
+ size_t size);
+XMLPUBFUN int XMLCALL
+ xmlBufferResize (xmlBufferPtr buf,
+ unsigned int size);
+XMLPUBFUN void XMLCALL
+ xmlBufferFree (xmlBufferPtr buf);
+XMLPUBFUN int XMLCALL
+ xmlBufferDump (FILE *file,
+ xmlBufferPtr buf);
+XMLPUBFUN int XMLCALL
+ xmlBufferAdd (xmlBufferPtr buf,
+ const xmlChar *str,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlBufferAddHead (xmlBufferPtr buf,
+ const xmlChar *str,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlBufferCat (xmlBufferPtr buf,
+ const xmlChar *str);
+XMLPUBFUN int XMLCALL
+ xmlBufferCCat (xmlBufferPtr buf,
+ const char *str);
+XMLPUBFUN int XMLCALL
+ xmlBufferShrink (xmlBufferPtr buf,
+ unsigned int len);
+XMLPUBFUN int XMLCALL
+ xmlBufferGrow (xmlBufferPtr buf,
+ unsigned int len);
+XMLPUBFUN void XMLCALL
+ xmlBufferEmpty (xmlBufferPtr buf);
+XMLPUBFUN const xmlChar* XMLCALL
+ xmlBufferContent (const xmlBufferPtr buf);
+XMLPUBFUN xmlChar* XMLCALL
+ xmlBufferDetach (xmlBufferPtr buf);
+XMLPUBFUN void XMLCALL
+ xmlBufferSetAllocationScheme(xmlBufferPtr buf,
+ xmlBufferAllocationScheme scheme);
+XMLPUBFUN int XMLCALL
+ xmlBufferLength (const xmlBufferPtr buf);
+
+/*
+ * Creating/freeing new structures.
+ */
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlCreateIntSubset (xmlDocPtr doc,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlNewDtd (xmlDocPtr doc,
+ const xmlChar *name,
+ const xmlChar *ExternalID,
+ const xmlChar *SystemID);
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlGetIntSubset (xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlFreeDtd (xmlDtdPtr cur);
+#ifdef LIBXML_LEGACY_ENABLED
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlNewGlobalNs (xmlDocPtr doc,
+ const xmlChar *href,
+ const xmlChar *prefix);
+#endif /* LIBXML_LEGACY_ENABLED */
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlNewNs (xmlNodePtr node,
+ const xmlChar *href,
+ const xmlChar *prefix);
+XMLPUBFUN void XMLCALL
+ xmlFreeNs (xmlNsPtr cur);
+XMLPUBFUN void XMLCALL
+ xmlFreeNsList (xmlNsPtr cur);
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlNewDoc (const xmlChar *version);
+XMLPUBFUN void XMLCALL
+ xmlFreeDoc (xmlDocPtr cur);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlNewDocProp (xmlDocPtr doc,
+ const xmlChar *name,
+ const xmlChar *value);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
+ defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlNewProp (xmlNodePtr node,
+ const xmlChar *name,
+ const xmlChar *value);
+#endif
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlNewNsProp (xmlNodePtr node,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *value);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlNewNsPropEatName (xmlNodePtr node,
+ xmlNsPtr ns,
+ xmlChar *name,
+ const xmlChar *value);
+XMLPUBFUN void XMLCALL
+ xmlFreePropList (xmlAttrPtr cur);
+XMLPUBFUN void XMLCALL
+ xmlFreeProp (xmlAttrPtr cur);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlCopyProp (xmlNodePtr target,
+ xmlAttrPtr cur);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlCopyPropList (xmlNodePtr target,
+ xmlAttrPtr cur);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlDtdPtr XMLCALL
+ xmlCopyDtd (xmlDtdPtr dtd);
+#endif /* LIBXML_TREE_ENABLED */
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlCopyDoc (xmlDocPtr doc,
+ int recursive);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */
+/*
+ * Creating new nodes.
+ */
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocNode (xmlDocPtr doc,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocNodeEatName (xmlDocPtr doc,
+ xmlNsPtr ns,
+ xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewNode (xmlNsPtr ns,
+ const xmlChar *name);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewNodeEatName (xmlNsPtr ns,
+ xmlChar *name);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewChild (xmlNodePtr parent,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *content);
+#endif
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocText (xmlDocPtr doc,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewText (const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocPI (xmlDocPtr doc,
+ const xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewPI (const xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocTextLen (xmlDocPtr doc,
+ const xmlChar *content,
+ int len);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewTextLen (const xmlChar *content,
+ int len);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocComment (xmlDocPtr doc,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewComment (const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewCDataBlock (xmlDocPtr doc,
+ const xmlChar *content,
+ int len);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewCharRef (xmlDocPtr doc,
+ const xmlChar *name);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewReference (xmlDocPtr doc,
+ const xmlChar *name);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlCopyNode (const xmlNodePtr node,
+ int recursive);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlDocCopyNode (const xmlNodePtr node,
+ xmlDocPtr doc,
+ int recursive);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlDocCopyNodeList (xmlDocPtr doc,
+ const xmlNodePtr node);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlCopyNodeList (const xmlNodePtr node);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewTextChild (xmlNodePtr parent,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocRawNode (xmlDocPtr doc,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *content);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNewDocFragment (xmlDocPtr doc);
+#endif /* LIBXML_TREE_ENABLED */
+
+/*
+ * Navigating.
+ */
+XMLPUBFUN long XMLCALL
+ xmlGetLineNo (xmlNodePtr node);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
+XMLPUBFUN xmlChar * XMLCALL
+ xmlGetNodePath (xmlNodePtr node);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) */
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlDocGetRootElement (xmlDocPtr doc);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlGetLastChild (xmlNodePtr parent);
+XMLPUBFUN int XMLCALL
+ xmlNodeIsText (xmlNodePtr node);
+XMLPUBFUN int XMLCALL
+ xmlIsBlankNode (xmlNodePtr node);
+
+/*
+ * Changing the structure.
+ */
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlDocSetRootElement (xmlDocPtr doc,
+ xmlNodePtr root);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlNodeSetName (xmlNodePtr cur,
+ const xmlChar *name);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlAddChild (xmlNodePtr parent,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlAddChildList (xmlNodePtr parent,
+ xmlNodePtr cur);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlReplaceNode (xmlNodePtr old,
+ xmlNodePtr cur);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
+ defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlAddPrevSibling (xmlNodePtr cur,
+ xmlNodePtr elem);
+#endif /* LIBXML_TREE_ENABLED || LIBXML_HTML_ENABLED || LIBXML_SCHEMAS_ENABLED */
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlAddSibling (xmlNodePtr cur,
+ xmlNodePtr elem);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlAddNextSibling (xmlNodePtr cur,
+ xmlNodePtr elem);
+XMLPUBFUN void XMLCALL
+ xmlUnlinkNode (xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlTextMerge (xmlNodePtr first,
+ xmlNodePtr second);
+XMLPUBFUN int XMLCALL
+ xmlTextConcat (xmlNodePtr node,
+ const xmlChar *content,
+ int len);
+XMLPUBFUN void XMLCALL
+ xmlFreeNodeList (xmlNodePtr cur);
+XMLPUBFUN void XMLCALL
+ xmlFreeNode (xmlNodePtr cur);
+XMLPUBFUN void XMLCALL
+ xmlSetTreeDoc (xmlNodePtr tree,
+ xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlSetListDoc (xmlNodePtr list,
+ xmlDocPtr doc);
+/*
+ * Namespaces.
+ */
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlSearchNs (xmlDocPtr doc,
+ xmlNodePtr node,
+ const xmlChar *nameSpace);
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlSearchNsByHref (xmlDocPtr doc,
+ xmlNodePtr node,
+ const xmlChar *href);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN xmlNsPtr * XMLCALL
+ xmlGetNsList (xmlDocPtr doc,
+ xmlNodePtr node);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) */
+
+XMLPUBFUN void XMLCALL
+ xmlSetNs (xmlNodePtr node,
+ xmlNsPtr ns);
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlCopyNamespace (xmlNsPtr cur);
+XMLPUBFUN xmlNsPtr XMLCALL
+ xmlCopyNamespaceList (xmlNsPtr cur);
+
+/*
+ * Changing the content.
+ */
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlSetProp (xmlNodePtr node,
+ const xmlChar *name,
+ const xmlChar *value);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlSetNsProp (xmlNodePtr node,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *value);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlGetNoNsProp (xmlNodePtr node,
+ const xmlChar *name);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlGetProp (xmlNodePtr node,
+ const xmlChar *name);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlHasProp (xmlNodePtr node,
+ const xmlChar *name);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlHasNsProp (xmlNodePtr node,
+ const xmlChar *name,
+ const xmlChar *nameSpace);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlGetNsProp (xmlNodePtr node,
+ const xmlChar *name,
+ const xmlChar *nameSpace);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlStringGetNodeList (xmlDocPtr doc,
+ const xmlChar *value);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlStringLenGetNodeList (xmlDocPtr doc,
+ const xmlChar *value,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNodeListGetString (xmlDocPtr doc,
+ xmlNodePtr list,
+ int inLine);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNodeListGetRawString (xmlDocPtr doc,
+ xmlNodePtr list,
+ int inLine);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlNodeSetContent (xmlNodePtr cur,
+ const xmlChar *content);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlNodeSetContentLen (xmlNodePtr cur,
+ const xmlChar *content,
+ int len);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlNodeAddContent (xmlNodePtr cur,
+ const xmlChar *content);
+XMLPUBFUN void XMLCALL
+ xmlNodeAddContentLen (xmlNodePtr cur,
+ const xmlChar *content,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNodeGetContent (xmlNodePtr cur);
+
+XMLPUBFUN int XMLCALL
+ xmlNodeBufGetContent (xmlBufferPtr buffer,
+ xmlNodePtr cur);
+XMLPUBFUN int XMLCALL
+ xmlBufGetNodeContent (xmlBufPtr buf,
+ xmlNodePtr cur);
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNodeGetLang (xmlNodePtr cur);
+XMLPUBFUN int XMLCALL
+ xmlNodeGetSpacePreserve (xmlNodePtr cur);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlNodeSetLang (xmlNodePtr cur,
+ const xmlChar *lang);
+XMLPUBFUN void XMLCALL
+ xmlNodeSetSpacePreserve (xmlNodePtr cur,
+ int val);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNodeGetBase (xmlDocPtr doc,
+ xmlNodePtr cur);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
+XMLPUBFUN void XMLCALL
+ xmlNodeSetBase (xmlNodePtr cur,
+ const xmlChar *uri);
+#endif
+
+/*
+ * Removing content.
+ */
+XMLPUBFUN int XMLCALL
+ xmlRemoveProp (xmlAttrPtr cur);
+#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN int XMLCALL
+ xmlUnsetNsProp (xmlNodePtr node,
+ xmlNsPtr ns,
+ const xmlChar *name);
+XMLPUBFUN int XMLCALL
+ xmlUnsetProp (xmlNodePtr node,
+ const xmlChar *name);
+#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */
+
+/*
+ * Internal, don't use.
+ */
+XMLPUBFUN void XMLCALL
+ xmlBufferWriteCHAR (xmlBufferPtr buf,
+ const xmlChar *string);
+XMLPUBFUN void XMLCALL
+ xmlBufferWriteChar (xmlBufferPtr buf,
+ const char *string);
+XMLPUBFUN void XMLCALL
+ xmlBufferWriteQuotedString(xmlBufferPtr buf,
+ const xmlChar *string);
+
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void xmlAttrSerializeTxtContent(xmlBufferPtr buf,
+ xmlDocPtr doc,
+ xmlAttrPtr attr,
+ const xmlChar *string);
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+#ifdef LIBXML_TREE_ENABLED
+/*
+ * Namespace handling.
+ */
+XMLPUBFUN int XMLCALL
+ xmlReconciliateNs (xmlDocPtr doc,
+ xmlNodePtr tree);
+#endif
+
+#ifdef LIBXML_OUTPUT_ENABLED
+/*
+ * Saving.
+ */
+XMLPUBFUN void XMLCALL
+ xmlDocDumpFormatMemory (xmlDocPtr cur,
+ xmlChar **mem,
+ int *size,
+ int format);
+XMLPUBFUN void XMLCALL
+ xmlDocDumpMemory (xmlDocPtr cur,
+ xmlChar **mem,
+ int *size);
+XMLPUBFUN void XMLCALL
+ xmlDocDumpMemoryEnc (xmlDocPtr out_doc,
+ xmlChar **doc_txt_ptr,
+ int * doc_txt_len,
+ const char *txt_encoding);
+XMLPUBFUN void XMLCALL
+ xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc,
+ xmlChar **doc_txt_ptr,
+ int * doc_txt_len,
+ const char *txt_encoding,
+ int format);
+XMLPUBFUN int XMLCALL
+ xmlDocFormatDump (FILE *f,
+ xmlDocPtr cur,
+ int format);
+XMLPUBFUN int XMLCALL
+ xmlDocDump (FILE *f,
+ xmlDocPtr cur);
+XMLPUBFUN void XMLCALL
+ xmlElemDump (FILE *f,
+ xmlDocPtr doc,
+ xmlNodePtr cur);
+XMLPUBFUN int XMLCALL
+ xmlSaveFile (const char *filename,
+ xmlDocPtr cur);
+XMLPUBFUN int XMLCALL
+ xmlSaveFormatFile (const char *filename,
+ xmlDocPtr cur,
+ int format);
+XMLPUBFUN size_t XMLCALL
+ xmlBufNodeDump (xmlBufPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ int level,
+ int format);
+XMLPUBFUN int XMLCALL
+ xmlNodeDump (xmlBufferPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ int level,
+ int format);
+
+XMLPUBFUN int XMLCALL
+ xmlSaveFileTo (xmlOutputBufferPtr buf,
+ xmlDocPtr cur,
+ const char *encoding);
+XMLPUBFUN int XMLCALL
+ xmlSaveFormatFileTo (xmlOutputBufferPtr buf,
+ xmlDocPtr cur,
+ const char *encoding,
+ int format);
+XMLPUBFUN void XMLCALL
+ xmlNodeDumpOutput (xmlOutputBufferPtr buf,
+ xmlDocPtr doc,
+ xmlNodePtr cur,
+ int level,
+ int format,
+ const char *encoding);
+
+XMLPUBFUN int XMLCALL
+ xmlSaveFormatFileEnc (const char *filename,
+ xmlDocPtr cur,
+ const char *encoding,
+ int format);
+
+XMLPUBFUN int XMLCALL
+ xmlSaveFileEnc (const char *filename,
+ xmlDocPtr cur,
+ const char *encoding);
+
+#endif /* LIBXML_OUTPUT_ENABLED */
+/*
+ * XHTML
+ */
+XMLPUBFUN int XMLCALL
+ xmlIsXHTML (const xmlChar *systemID,
+ const xmlChar *publicID);
+
+/*
+ * Compression.
+ */
+XMLPUBFUN int XMLCALL
+ xmlGetDocCompressMode (xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlSetDocCompressMode (xmlDocPtr doc,
+ int mode);
+XMLPUBFUN int XMLCALL
+ xmlGetCompressMode (void);
+XMLPUBFUN void XMLCALL
+ xmlSetCompressMode (int mode);
+
+/*
+* DOM-wrapper helper functions.
+*/
+XMLPUBFUN xmlDOMWrapCtxtPtr XMLCALL
+ xmlDOMWrapNewCtxt (void);
+XMLPUBFUN void XMLCALL
+ xmlDOMWrapFreeCtxt (xmlDOMWrapCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt,
+ xmlNodePtr elem,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt,
+ xmlDocPtr sourceDoc,
+ xmlNodePtr node,
+ xmlDocPtr destDoc,
+ xmlNodePtr destParent,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlDOMWrapRemoveNode (xmlDOMWrapCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr node,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlDOMWrapCloneNode (xmlDOMWrapCtxtPtr ctxt,
+ xmlDocPtr sourceDoc,
+ xmlNodePtr node,
+ xmlNodePtr *clonedNode,
+ xmlDocPtr destDoc,
+ xmlNodePtr destParent,
+ int deep,
+ int options);
+
+#ifdef LIBXML_TREE_ENABLED
+/*
+ * 5 interfaces from DOM ElementTraversal, but different in entities
+ * traversal.
+ */
+XMLPUBFUN unsigned long XMLCALL
+ xmlChildElementCount (xmlNodePtr parent);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlNextElementSibling (xmlNodePtr node);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlFirstElementChild (xmlNodePtr parent);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlLastElementChild (xmlNodePtr parent);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlPreviousElementSibling (xmlNodePtr node);
+#endif
+#ifdef __cplusplus
+}
+#endif
+#ifndef __XML_PARSER_H__
+#include <libxml/xmlmemory.h>
+#endif
+
+#endif /* __XML_TREE_H__ */
+
--- /dev/null
+/**
+ * Summary: library of generic URI related routines
+ * Description: library of generic URI related routines
+ * Implements RFC 2396
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_URI_H__
+#define __XML_URI_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlURI:
+ *
+ * A parsed URI reference. This is a struct containing the various fields
+ * as described in RFC 2396 but separated for further processing.
+ *
+ * Note: query is a deprecated field which is incorrectly unescaped.
+ * query_raw takes precedence over query if the former is set.
+ * See: http://mail.gnome.org/archives/xml/2007-April/thread.html#00127
+ */
+typedef struct _xmlURI xmlURI;
+typedef xmlURI *xmlURIPtr;
+struct _xmlURI {
+ char *scheme; /* the URI scheme */
+ char *opaque; /* opaque part */
+ char *authority; /* the authority part */
+ char *server; /* the server part */
+ char *user; /* the user part */
+ int port; /* the port number */
+ char *path; /* the path string */
+ char *query; /* the query string (deprecated - use with caution) */
+ char *fragment; /* the fragment identifier */
+ int cleanup; /* parsing potentially unclean URI */
+ char *query_raw; /* the query string (as it appears in the URI) */
+};
+
+/*
+ * This function is in tree.h:
+ * xmlChar * xmlNodeGetBase (xmlDocPtr doc,
+ * xmlNodePtr cur);
+ */
+XMLPUBFUN xmlURIPtr XMLCALL
+ xmlCreateURI (void);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlBuildURI (const xmlChar *URI,
+ const xmlChar *base);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlBuildRelativeURI (const xmlChar *URI,
+ const xmlChar *base);
+XMLPUBFUN xmlURIPtr XMLCALL
+ xmlParseURI (const char *str);
+XMLPUBFUN xmlURIPtr XMLCALL
+ xmlParseURIRaw (const char *str,
+ int raw);
+XMLPUBFUN int XMLCALL
+ xmlParseURIReference (xmlURIPtr uri,
+ const char *str);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlSaveUri (xmlURIPtr uri);
+XMLPUBFUN void XMLCALL
+ xmlPrintURI (FILE *stream,
+ xmlURIPtr uri);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlURIEscapeStr (const xmlChar *str,
+ const xmlChar *list);
+XMLPUBFUN char * XMLCALL
+ xmlURIUnescapeString (const char *str,
+ int len,
+ char *target);
+XMLPUBFUN int XMLCALL
+ xmlNormalizeURIPath (char *path);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlURIEscape (const xmlChar *str);
+XMLPUBFUN void XMLCALL
+ xmlFreeURI (xmlURIPtr uri);
+XMLPUBFUN xmlChar* XMLCALL
+ xmlCanonicPath (const xmlChar *path);
+XMLPUBFUN xmlChar* XMLCALL
+ xmlPathToURI (const xmlChar *path);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_URI_H__ */
--- /dev/null
+/*
+ * Summary: The DTD validation
+ * Description: API for the DTD handling and the validity checking
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_VALID_H__
+#define __XML_VALID_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/xmlerror.h>
+#include <libxml/tree.h>
+#include <libxml/list.h>
+#include <libxml/xmlautomata.h>
+#include <libxml/xmlregexp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Validation state added for non-determinist content model.
+ */
+typedef struct _xmlValidState xmlValidState;
+typedef xmlValidState *xmlValidStatePtr;
+
+/**
+ * xmlValidityErrorFunc:
+ * @ctx: usually an xmlValidCtxtPtr to a validity error context,
+ * but comes from ctxt->userData (which normally contains such
+ * a pointer); ctxt->userData can be changed by the user.
+ * @msg: the string to format *printf like vararg
+ * @...: remaining arguments to the format
+ *
+ * Callback called when a validity error is found. This is a message
+ * oriented function similar to an *printf function.
+ */
+typedef void (XMLCDECL *xmlValidityErrorFunc) (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+
+/**
+ * xmlValidityWarningFunc:
+ * @ctx: usually an xmlValidCtxtPtr to a validity error context,
+ * but comes from ctxt->userData (which normally contains such
+ * a pointer); ctxt->userData can be changed by the user.
+ * @msg: the string to format *printf like vararg
+ * @...: remaining arguments to the format
+ *
+ * Callback called when a validity warning is found. This is a message
+ * oriented function similar to an *printf function.
+ */
+typedef void (XMLCDECL *xmlValidityWarningFunc) (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+
+#ifdef IN_LIBXML
+/**
+ * XML_CTXT_FINISH_DTD_0:
+ *
+ * Special value for finishDtd field when embedded in an xmlParserCtxt
+ */
+#define XML_CTXT_FINISH_DTD_0 0xabcd1234
+/**
+ * XML_CTXT_FINISH_DTD_1:
+ *
+ * Special value for finishDtd field when embedded in an xmlParserCtxt
+ */
+#define XML_CTXT_FINISH_DTD_1 0xabcd1235
+#endif
+
+/*
+ * xmlValidCtxt:
+ * An xmlValidCtxt is used for error reporting when validating.
+ */
+typedef struct _xmlValidCtxt xmlValidCtxt;
+typedef xmlValidCtxt *xmlValidCtxtPtr;
+struct _xmlValidCtxt {
+ void *userData; /* user specific data block */
+ xmlValidityErrorFunc error; /* the callback in case of errors */
+ xmlValidityWarningFunc warning; /* the callback in case of warning */
+
+ /* Node analysis stack used when validating within entities */
+ xmlNodePtr node; /* Current parsed Node */
+ int nodeNr; /* Depth of the parsing stack */
+ int nodeMax; /* Max depth of the parsing stack */
+ xmlNodePtr *nodeTab; /* array of nodes */
+
+ unsigned int finishDtd; /* finished validating the Dtd ? */
+ xmlDocPtr doc; /* the document */
+ int valid; /* temporary validity check result */
+
+ /* state state used for non-determinist content validation */
+ xmlValidState *vstate; /* current state */
+ int vstateNr; /* Depth of the validation stack */
+ int vstateMax; /* Max depth of the validation stack */
+ xmlValidState *vstateTab; /* array of validation states */
+
+#ifdef LIBXML_REGEXP_ENABLED
+ xmlAutomataPtr am; /* the automata */
+ xmlAutomataStatePtr state; /* used to build the automata */
+#else
+ void *am;
+ void *state;
+#endif
+};
+
+/*
+ * ALL notation declarations are stored in a table.
+ * There is one table per DTD.
+ */
+
+typedef struct _xmlHashTable xmlNotationTable;
+typedef xmlNotationTable *xmlNotationTablePtr;
+
+/*
+ * ALL element declarations are stored in a table.
+ * There is one table per DTD.
+ */
+
+typedef struct _xmlHashTable xmlElementTable;
+typedef xmlElementTable *xmlElementTablePtr;
+
+/*
+ * ALL attribute declarations are stored in a table.
+ * There is one table per DTD.
+ */
+
+typedef struct _xmlHashTable xmlAttributeTable;
+typedef xmlAttributeTable *xmlAttributeTablePtr;
+
+/*
+ * ALL IDs attributes are stored in a table.
+ * There is one table per document.
+ */
+
+typedef struct _xmlHashTable xmlIDTable;
+typedef xmlIDTable *xmlIDTablePtr;
+
+/*
+ * ALL Refs attributes are stored in a table.
+ * There is one table per document.
+ */
+
+typedef struct _xmlHashTable xmlRefTable;
+typedef xmlRefTable *xmlRefTablePtr;
+
+/* Notation */
+XMLPUBFUN xmlNotationPtr XMLCALL
+ xmlAddNotationDecl (xmlValidCtxtPtr ctxt,
+ xmlDtdPtr dtd,
+ const xmlChar *name,
+ const xmlChar *PublicID,
+ const xmlChar *SystemID);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlNotationTablePtr XMLCALL
+ xmlCopyNotationTable (xmlNotationTablePtr table);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlFreeNotationTable (xmlNotationTablePtr table);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlDumpNotationDecl (xmlBufferPtr buf,
+ xmlNotationPtr nota);
+XMLPUBFUN void XMLCALL
+ xmlDumpNotationTable (xmlBufferPtr buf,
+ xmlNotationTablePtr table);
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+/* Element Content */
+/* the non Doc version are being deprecated */
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlNewElementContent (const xmlChar *name,
+ xmlElementContentType type);
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlCopyElementContent (xmlElementContentPtr content);
+XMLPUBFUN void XMLCALL
+ xmlFreeElementContent (xmlElementContentPtr cur);
+/* the new versions with doc argument */
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlNewDocElementContent (xmlDocPtr doc,
+ const xmlChar *name,
+ xmlElementContentType type);
+XMLPUBFUN xmlElementContentPtr XMLCALL
+ xmlCopyDocElementContent(xmlDocPtr doc,
+ xmlElementContentPtr content);
+XMLPUBFUN void XMLCALL
+ xmlFreeDocElementContent(xmlDocPtr doc,
+ xmlElementContentPtr cur);
+XMLPUBFUN void XMLCALL
+ xmlSnprintfElementContent(char *buf,
+ int size,
+ xmlElementContentPtr content,
+ int englob);
+#ifdef LIBXML_OUTPUT_ENABLED
+/* DEPRECATED */
+XMLPUBFUN void XMLCALL
+ xmlSprintfElementContent(char *buf,
+ xmlElementContentPtr content,
+ int englob);
+#endif /* LIBXML_OUTPUT_ENABLED */
+/* DEPRECATED */
+
+/* Element */
+XMLPUBFUN xmlElementPtr XMLCALL
+ xmlAddElementDecl (xmlValidCtxtPtr ctxt,
+ xmlDtdPtr dtd,
+ const xmlChar *name,
+ xmlElementTypeVal type,
+ xmlElementContentPtr content);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlElementTablePtr XMLCALL
+ xmlCopyElementTable (xmlElementTablePtr table);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlFreeElementTable (xmlElementTablePtr table);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlDumpElementTable (xmlBufferPtr buf,
+ xmlElementTablePtr table);
+XMLPUBFUN void XMLCALL
+ xmlDumpElementDecl (xmlBufferPtr buf,
+ xmlElementPtr elem);
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+/* Enumeration */
+XMLPUBFUN xmlEnumerationPtr XMLCALL
+ xmlCreateEnumeration (const xmlChar *name);
+XMLPUBFUN void XMLCALL
+ xmlFreeEnumeration (xmlEnumerationPtr cur);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlEnumerationPtr XMLCALL
+ xmlCopyEnumeration (xmlEnumerationPtr cur);
+#endif /* LIBXML_TREE_ENABLED */
+
+/* Attribute */
+XMLPUBFUN xmlAttributePtr XMLCALL
+ xmlAddAttributeDecl (xmlValidCtxtPtr ctxt,
+ xmlDtdPtr dtd,
+ const xmlChar *elem,
+ const xmlChar *name,
+ const xmlChar *ns,
+ xmlAttributeType type,
+ xmlAttributeDefault def,
+ const xmlChar *defaultValue,
+ xmlEnumerationPtr tree);
+#ifdef LIBXML_TREE_ENABLED
+XMLPUBFUN xmlAttributeTablePtr XMLCALL
+ xmlCopyAttributeTable (xmlAttributeTablePtr table);
+#endif /* LIBXML_TREE_ENABLED */
+XMLPUBFUN void XMLCALL
+ xmlFreeAttributeTable (xmlAttributeTablePtr table);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlDumpAttributeTable (xmlBufferPtr buf,
+ xmlAttributeTablePtr table);
+XMLPUBFUN void XMLCALL
+ xmlDumpAttributeDecl (xmlBufferPtr buf,
+ xmlAttributePtr attr);
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+/* IDs */
+XMLPUBFUN xmlIDPtr XMLCALL
+ xmlAddID (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ const xmlChar *value,
+ xmlAttrPtr attr);
+XMLPUBFUN void XMLCALL
+ xmlFreeIDTable (xmlIDTablePtr table);
+XMLPUBFUN xmlAttrPtr XMLCALL
+ xmlGetID (xmlDocPtr doc,
+ const xmlChar *ID);
+XMLPUBFUN int XMLCALL
+ xmlIsID (xmlDocPtr doc,
+ xmlNodePtr elem,
+ xmlAttrPtr attr);
+XMLPUBFUN int XMLCALL
+ xmlRemoveID (xmlDocPtr doc,
+ xmlAttrPtr attr);
+
+/* IDREFs */
+XMLPUBFUN xmlRefPtr XMLCALL
+ xmlAddRef (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ const xmlChar *value,
+ xmlAttrPtr attr);
+XMLPUBFUN void XMLCALL
+ xmlFreeRefTable (xmlRefTablePtr table);
+XMLPUBFUN int XMLCALL
+ xmlIsRef (xmlDocPtr doc,
+ xmlNodePtr elem,
+ xmlAttrPtr attr);
+XMLPUBFUN int XMLCALL
+ xmlRemoveRef (xmlDocPtr doc,
+ xmlAttrPtr attr);
+XMLPUBFUN xmlListPtr XMLCALL
+ xmlGetRefs (xmlDocPtr doc,
+ const xmlChar *ID);
+
+/**
+ * The public function calls related to validity checking.
+ */
+#ifdef LIBXML_VALID_ENABLED
+/* Allocate/Release Validation Contexts */
+XMLPUBFUN xmlValidCtxtPtr XMLCALL
+ xmlNewValidCtxt(void);
+XMLPUBFUN void XMLCALL
+ xmlFreeValidCtxt(xmlValidCtxtPtr);
+
+XMLPUBFUN int XMLCALL
+ xmlValidateRoot (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlValidateElementDecl (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlElementPtr elem);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlValidNormalizeAttributeValue(xmlDocPtr doc,
+ xmlNodePtr elem,
+ const xmlChar *name,
+ const xmlChar *value);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem,
+ const xmlChar *name,
+ const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlAttributePtr attr);
+XMLPUBFUN int XMLCALL
+ xmlValidateAttributeValue(xmlAttributeType type,
+ const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateNotationDecl (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNotationPtr nota);
+XMLPUBFUN int XMLCALL
+ xmlValidateDtd (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlDtdPtr dtd);
+XMLPUBFUN int XMLCALL
+ xmlValidateDtdFinal (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlValidateDocument (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlValidateElement (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ xmlValidateOneElement (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ xmlValidateOneAttribute (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem,
+ xmlAttrPtr attr,
+ const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateOneNamespace (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem,
+ const xmlChar *prefix,
+ xmlNsPtr ns,
+ const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc);
+#endif /* LIBXML_VALID_ENABLED */
+
+#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN int XMLCALL
+ xmlValidateNotationUse (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ const xmlChar *notationName);
+#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */
+
+XMLPUBFUN int XMLCALL
+ xmlIsMixedElement (xmlDocPtr doc,
+ const xmlChar *name);
+XMLPUBFUN xmlAttributePtr XMLCALL
+ xmlGetDtdAttrDesc (xmlDtdPtr dtd,
+ const xmlChar *elem,
+ const xmlChar *name);
+XMLPUBFUN xmlAttributePtr XMLCALL
+ xmlGetDtdQAttrDesc (xmlDtdPtr dtd,
+ const xmlChar *elem,
+ const xmlChar *name,
+ const xmlChar *prefix);
+XMLPUBFUN xmlNotationPtr XMLCALL
+ xmlGetDtdNotationDesc (xmlDtdPtr dtd,
+ const xmlChar *name);
+XMLPUBFUN xmlElementPtr XMLCALL
+ xmlGetDtdQElementDesc (xmlDtdPtr dtd,
+ const xmlChar *name,
+ const xmlChar *prefix);
+XMLPUBFUN xmlElementPtr XMLCALL
+ xmlGetDtdElementDesc (xmlDtdPtr dtd,
+ const xmlChar *name);
+
+#ifdef LIBXML_VALID_ENABLED
+
+XMLPUBFUN int XMLCALL
+ xmlValidGetPotentialChildren(xmlElementContent *ctree,
+ const xmlChar **names,
+ int *len,
+ int max);
+
+XMLPUBFUN int XMLCALL
+ xmlValidGetValidElements(xmlNode *prev,
+ xmlNode *next,
+ const xmlChar **names,
+ int max);
+XMLPUBFUN int XMLCALL
+ xmlValidateNameValue (const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateNamesValue (const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateNmtokenValue (const xmlChar *value);
+XMLPUBFUN int XMLCALL
+ xmlValidateNmtokensValue(const xmlChar *value);
+
+#ifdef LIBXML_REGEXP_ENABLED
+/*
+ * Validation based on the regexp support
+ */
+XMLPUBFUN int XMLCALL
+ xmlValidBuildContentModel(xmlValidCtxtPtr ctxt,
+ xmlElementPtr elem);
+
+XMLPUBFUN int XMLCALL
+ xmlValidatePushElement (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem,
+ const xmlChar *qname);
+XMLPUBFUN int XMLCALL
+ xmlValidatePushCData (xmlValidCtxtPtr ctxt,
+ const xmlChar *data,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlValidatePopElement (xmlValidCtxtPtr ctxt,
+ xmlDocPtr doc,
+ xmlNodePtr elem,
+ const xmlChar *qname);
+#endif /* LIBXML_REGEXP_ENABLED */
+#endif /* LIBXML_VALID_ENABLED */
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_VALID_H__ */
--- /dev/null
+/*
+ * Summary: implementation of XInclude
+ * Description: API to handle XInclude processing,
+ * implements the
+ * World Wide Web Consortium Last Call Working Draft 10 November 2003
+ * http://www.w3.org/TR/2003/WD-xinclude-20031110
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XINCLUDE_H__
+#define __XML_XINCLUDE_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef LIBXML_XINCLUDE_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * XINCLUDE_NS:
+ *
+ * Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude
+ */
+#define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2003/XInclude"
+/**
+ * XINCLUDE_OLD_NS:
+ *
+ * Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude
+ */
+#define XINCLUDE_OLD_NS (const xmlChar *) "http://www.w3.org/2001/XInclude"
+/**
+ * XINCLUDE_NODE:
+ *
+ * Macro defining "include"
+ */
+#define XINCLUDE_NODE (const xmlChar *) "include"
+/**
+ * XINCLUDE_FALLBACK:
+ *
+ * Macro defining "fallback"
+ */
+#define XINCLUDE_FALLBACK (const xmlChar *) "fallback"
+/**
+ * XINCLUDE_HREF:
+ *
+ * Macro defining "href"
+ */
+#define XINCLUDE_HREF (const xmlChar *) "href"
+/**
+ * XINCLUDE_PARSE:
+ *
+ * Macro defining "parse"
+ */
+#define XINCLUDE_PARSE (const xmlChar *) "parse"
+/**
+ * XINCLUDE_PARSE_XML:
+ *
+ * Macro defining "xml"
+ */
+#define XINCLUDE_PARSE_XML (const xmlChar *) "xml"
+/**
+ * XINCLUDE_PARSE_TEXT:
+ *
+ * Macro defining "text"
+ */
+#define XINCLUDE_PARSE_TEXT (const xmlChar *) "text"
+/**
+ * XINCLUDE_PARSE_ENCODING:
+ *
+ * Macro defining "encoding"
+ */
+#define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding"
+/**
+ * XINCLUDE_PARSE_XPOINTER:
+ *
+ * Macro defining "xpointer"
+ */
+#define XINCLUDE_PARSE_XPOINTER (const xmlChar *) "xpointer"
+
+typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt;
+typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr;
+
+/*
+ * standalone processing
+ */
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcess (xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessFlags (xmlDocPtr doc,
+ int flags);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessFlagsData(xmlDocPtr doc,
+ int flags,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree,
+ int flags,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessTree (xmlNodePtr tree);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessTreeFlags(xmlNodePtr tree,
+ int flags);
+/*
+ * contextual processing
+ */
+XMLPUBFUN xmlXIncludeCtxtPtr XMLCALL
+ xmlXIncludeNewContext (xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeSetFlags (xmlXIncludeCtxtPtr ctxt,
+ int flags);
+XMLPUBFUN void XMLCALL
+ xmlXIncludeFreeContext (xmlXIncludeCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlXIncludeProcessNode (xmlXIncludeCtxtPtr ctxt,
+ xmlNodePtr tree);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_XINCLUDE_ENABLED */
+
+#endif /* __XML_XINCLUDE_H__ */
--- /dev/null
+/*
+ * Summary: unfinished XLink detection module
+ * Description: unfinished XLink detection module
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XLINK_H__
+#define __XML_XLINK_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef LIBXML_XPTR_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Various defines for the various Link properties.
+ *
+ * NOTE: the link detection layer will try to resolve QName expansion
+ * of namespaces. If "foo" is the prefix for "http://foo.com/"
+ * then the link detection layer will expand role="foo:myrole"
+ * to "http://foo.com/:myrole".
+ * NOTE: the link detection layer will expand URI-Refences found on
+ * href attributes by using the base mechanism if found.
+ */
+typedef xmlChar *xlinkHRef;
+typedef xmlChar *xlinkRole;
+typedef xmlChar *xlinkTitle;
+
+typedef enum {
+ XLINK_TYPE_NONE = 0,
+ XLINK_TYPE_SIMPLE,
+ XLINK_TYPE_EXTENDED,
+ XLINK_TYPE_EXTENDED_SET
+} xlinkType;
+
+typedef enum {
+ XLINK_SHOW_NONE = 0,
+ XLINK_SHOW_NEW,
+ XLINK_SHOW_EMBED,
+ XLINK_SHOW_REPLACE
+} xlinkShow;
+
+typedef enum {
+ XLINK_ACTUATE_NONE = 0,
+ XLINK_ACTUATE_AUTO,
+ XLINK_ACTUATE_ONREQUEST
+} xlinkActuate;
+
+/**
+ * xlinkNodeDetectFunc:
+ * @ctx: user data pointer
+ * @node: the node to check
+ *
+ * This is the prototype for the link detection routine.
+ * It calls the default link detection callbacks upon link detection.
+ */
+typedef void (*xlinkNodeDetectFunc) (void *ctx, xmlNodePtr node);
+
+/*
+ * The link detection module interact with the upper layers using
+ * a set of callback registered at parsing time.
+ */
+
+/**
+ * xlinkSimpleLinkFunk:
+ * @ctx: user data pointer
+ * @node: the node carrying the link
+ * @href: the target of the link
+ * @role: the role string
+ * @title: the link title
+ *
+ * This is the prototype for a simple link detection callback.
+ */
+typedef void
+(*xlinkSimpleLinkFunk) (void *ctx,
+ xmlNodePtr node,
+ const xlinkHRef href,
+ const xlinkRole role,
+ const xlinkTitle title);
+
+/**
+ * xlinkExtendedLinkFunk:
+ * @ctx: user data pointer
+ * @node: the node carrying the link
+ * @nbLocators: the number of locators detected on the link
+ * @hrefs: pointer to the array of locator hrefs
+ * @roles: pointer to the array of locator roles
+ * @nbArcs: the number of arcs detected on the link
+ * @from: pointer to the array of source roles found on the arcs
+ * @to: pointer to the array of target roles found on the arcs
+ * @show: array of values for the show attributes found on the arcs
+ * @actuate: array of values for the actuate attributes found on the arcs
+ * @nbTitles: the number of titles detected on the link
+ * @title: array of titles detected on the link
+ * @langs: array of xml:lang values for the titles
+ *
+ * This is the prototype for a extended link detection callback.
+ */
+typedef void
+(*xlinkExtendedLinkFunk)(void *ctx,
+ xmlNodePtr node,
+ int nbLocators,
+ const xlinkHRef *hrefs,
+ const xlinkRole *roles,
+ int nbArcs,
+ const xlinkRole *from,
+ const xlinkRole *to,
+ xlinkShow *show,
+ xlinkActuate *actuate,
+ int nbTitles,
+ const xlinkTitle *titles,
+ const xmlChar **langs);
+
+/**
+ * xlinkExtendedLinkSetFunk:
+ * @ctx: user data pointer
+ * @node: the node carrying the link
+ * @nbLocators: the number of locators detected on the link
+ * @hrefs: pointer to the array of locator hrefs
+ * @roles: pointer to the array of locator roles
+ * @nbTitles: the number of titles detected on the link
+ * @title: array of titles detected on the link
+ * @langs: array of xml:lang values for the titles
+ *
+ * This is the prototype for a extended link set detection callback.
+ */
+typedef void
+(*xlinkExtendedLinkSetFunk) (void *ctx,
+ xmlNodePtr node,
+ int nbLocators,
+ const xlinkHRef *hrefs,
+ const xlinkRole *roles,
+ int nbTitles,
+ const xlinkTitle *titles,
+ const xmlChar **langs);
+
+/**
+ * This is the structure containing a set of Links detection callbacks.
+ *
+ * There is no default xlink callbacks, if one want to get link
+ * recognition activated, those call backs must be provided before parsing.
+ */
+typedef struct _xlinkHandler xlinkHandler;
+typedef xlinkHandler *xlinkHandlerPtr;
+struct _xlinkHandler {
+ xlinkSimpleLinkFunk simple;
+ xlinkExtendedLinkFunk extended;
+ xlinkExtendedLinkSetFunk set;
+};
+
+/*
+ * The default detection routine, can be overridden, they call the default
+ * detection callbacks.
+ */
+
+XMLPUBFUN xlinkNodeDetectFunc XMLCALL
+ xlinkGetDefaultDetect (void);
+XMLPUBFUN void XMLCALL
+ xlinkSetDefaultDetect (xlinkNodeDetectFunc func);
+
+/*
+ * Routines to set/get the default handlers.
+ */
+XMLPUBFUN xlinkHandlerPtr XMLCALL
+ xlinkGetDefaultHandler (void);
+XMLPUBFUN void XMLCALL
+ xlinkSetDefaultHandler (xlinkHandlerPtr handler);
+
+/*
+ * Link detection module itself.
+ */
+XMLPUBFUN xlinkType XMLCALL
+ xlinkIsLink (xmlDocPtr doc,
+ xmlNodePtr node);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_XPTR_ENABLED */
+
+#endif /* __XML_XLINK_H__ */
--- /dev/null
+/*
+ * Summary: interface for the I/O interfaces used by the parser
+ * Description: interface for the I/O interfaces used by the parser
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_IO_H__
+#define __XML_IO_H__
+
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Those are the functions and datatypes for the parser input
+ * I/O structures.
+ */
+
+/**
+ * xmlInputMatchCallback:
+ * @filename: the filename or URI
+ *
+ * Callback used in the I/O Input API to detect if the current handler
+ * can provide input fonctionnalities for this resource.
+ *
+ * Returns 1 if yes and 0 if another Input module should be used
+ */
+typedef int (XMLCALL *xmlInputMatchCallback) (char const *filename);
+/**
+ * xmlInputOpenCallback:
+ * @filename: the filename or URI
+ *
+ * Callback used in the I/O Input API to open the resource
+ *
+ * Returns an Input context or NULL in case or error
+ */
+typedef void * (XMLCALL *xmlInputOpenCallback) (char const *filename);
+/**
+ * xmlInputReadCallback:
+ * @context: an Input context
+ * @buffer: the buffer to store data read
+ * @len: the length of the buffer in bytes
+ *
+ * Callback used in the I/O Input API to read the resource
+ *
+ * Returns the number of bytes read or -1 in case of error
+ */
+typedef int (XMLCALL *xmlInputReadCallback) (void * context, char * buffer, int len);
+/**
+ * xmlInputCloseCallback:
+ * @context: an Input context
+ *
+ * Callback used in the I/O Input API to close the resource
+ *
+ * Returns 0 or -1 in case of error
+ */
+typedef int (XMLCALL *xmlInputCloseCallback) (void * context);
+
+#ifdef LIBXML_OUTPUT_ENABLED
+/*
+ * Those are the functions and datatypes for the library output
+ * I/O structures.
+ */
+
+/**
+ * xmlOutputMatchCallback:
+ * @filename: the filename or URI
+ *
+ * Callback used in the I/O Output API to detect if the current handler
+ * can provide output fonctionnalities for this resource.
+ *
+ * Returns 1 if yes and 0 if another Output module should be used
+ */
+typedef int (XMLCALL *xmlOutputMatchCallback) (char const *filename);
+/**
+ * xmlOutputOpenCallback:
+ * @filename: the filename or URI
+ *
+ * Callback used in the I/O Output API to open the resource
+ *
+ * Returns an Output context or NULL in case or error
+ */
+typedef void * (XMLCALL *xmlOutputOpenCallback) (char const *filename);
+/**
+ * xmlOutputWriteCallback:
+ * @context: an Output context
+ * @buffer: the buffer of data to write
+ * @len: the length of the buffer in bytes
+ *
+ * Callback used in the I/O Output API to write to the resource
+ *
+ * Returns the number of bytes written or -1 in case of error
+ */
+typedef int (XMLCALL *xmlOutputWriteCallback) (void * context, const char * buffer,
+ int len);
+/**
+ * xmlOutputCloseCallback:
+ * @context: an Output context
+ *
+ * Callback used in the I/O Output API to close the resource
+ *
+ * Returns 0 or -1 in case of error
+ */
+typedef int (XMLCALL *xmlOutputCloseCallback) (void * context);
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <libxml/globals.h>
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <libxml/encoding.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct _xmlParserInputBuffer {
+ void* context;
+ xmlInputReadCallback readcallback;
+ xmlInputCloseCallback closecallback;
+
+ xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */
+
+ xmlBufPtr buffer; /* Local buffer encoded in UTF-8 */
+ xmlBufPtr raw; /* if encoder != NULL buffer for raw input */
+ int compressed; /* -1=unknown, 0=not compressed, 1=compressed */
+ int error;
+ unsigned long rawconsumed;/* amount consumed from raw */
+};
+
+
+#ifdef LIBXML_OUTPUT_ENABLED
+struct _xmlOutputBuffer {
+ void* context;
+ xmlOutputWriteCallback writecallback;
+ xmlOutputCloseCallback closecallback;
+
+ xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */
+
+ xmlBufPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */
+ xmlBufPtr conv; /* if encoder != NULL buffer for output */
+ int written; /* total number of byte written */
+ int error;
+};
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+/*
+ * Interfaces for input
+ */
+XMLPUBFUN void XMLCALL
+ xmlCleanupInputCallbacks (void);
+
+XMLPUBFUN int XMLCALL
+ xmlPopInputCallbacks (void);
+
+XMLPUBFUN void XMLCALL
+ xmlRegisterDefaultInputCallbacks (void);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlAllocParserInputBuffer (xmlCharEncoding enc);
+
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateFilename (const char *URI,
+ xmlCharEncoding enc);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateFile (FILE *file,
+ xmlCharEncoding enc);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateFd (int fd,
+ xmlCharEncoding enc);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateMem (const char *mem, int size,
+ xmlCharEncoding enc);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateStatic (const char *mem, int size,
+ xmlCharEncoding enc);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlParserInputBufferCreateIO (xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ xmlCharEncoding enc);
+XMLPUBFUN int XMLCALL
+ xmlParserInputBufferRead (xmlParserInputBufferPtr in,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlParserInputBufferGrow (xmlParserInputBufferPtr in,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlParserInputBufferPush (xmlParserInputBufferPtr in,
+ int len,
+ const char *buf);
+XMLPUBFUN void XMLCALL
+ xmlFreeParserInputBuffer (xmlParserInputBufferPtr in);
+XMLPUBFUN char * XMLCALL
+ xmlParserGetDirectory (const char *filename);
+
+XMLPUBFUN int XMLCALL
+ xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc,
+ xmlInputOpenCallback openFunc,
+ xmlInputReadCallback readFunc,
+ xmlInputCloseCallback closeFunc);
+
+xmlParserInputBufferPtr
+ __xmlParserInputBufferCreateFilename(const char *URI,
+ xmlCharEncoding enc);
+
+#ifdef LIBXML_OUTPUT_ENABLED
+/*
+ * Interfaces for output
+ */
+XMLPUBFUN void XMLCALL
+ xmlCleanupOutputCallbacks (void);
+XMLPUBFUN void XMLCALL
+ xmlRegisterDefaultOutputCallbacks(void);
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlOutputBufferCreateFilename (const char *URI,
+ xmlCharEncodingHandlerPtr encoder,
+ int compression);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlOutputBufferCreateFile (FILE *file,
+ xmlCharEncodingHandlerPtr encoder);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlOutputBufferCreateBuffer (xmlBufferPtr buffer,
+ xmlCharEncodingHandlerPtr encoder);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlOutputBufferCreateFd (int fd,
+ xmlCharEncodingHandlerPtr encoder);
+
+XMLPUBFUN xmlOutputBufferPtr XMLCALL
+ xmlOutputBufferCreateIO (xmlOutputWriteCallback iowrite,
+ xmlOutputCloseCallback ioclose,
+ void *ioctx,
+ xmlCharEncodingHandlerPtr encoder);
+
+/* Couple of APIs to get the output without digging into the buffers */
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlOutputBufferGetContent (xmlOutputBufferPtr out);
+XMLPUBFUN size_t XMLCALL
+ xmlOutputBufferGetSize (xmlOutputBufferPtr out);
+
+XMLPUBFUN int XMLCALL
+ xmlOutputBufferWrite (xmlOutputBufferPtr out,
+ int len,
+ const char *buf);
+XMLPUBFUN int XMLCALL
+ xmlOutputBufferWriteString (xmlOutputBufferPtr out,
+ const char *str);
+XMLPUBFUN int XMLCALL
+ xmlOutputBufferWriteEscape (xmlOutputBufferPtr out,
+ const xmlChar *str,
+ xmlCharEncodingOutputFunc escaping);
+
+XMLPUBFUN int XMLCALL
+ xmlOutputBufferFlush (xmlOutputBufferPtr out);
+XMLPUBFUN int XMLCALL
+ xmlOutputBufferClose (xmlOutputBufferPtr out);
+
+XMLPUBFUN int XMLCALL
+ xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc,
+ xmlOutputOpenCallback openFunc,
+ xmlOutputWriteCallback writeFunc,
+ xmlOutputCloseCallback closeFunc);
+
+xmlOutputBufferPtr
+ __xmlOutputBufferCreateFilename(const char *URI,
+ xmlCharEncodingHandlerPtr encoder,
+ int compression);
+
+#ifdef LIBXML_HTTP_ENABLED
+/* This function only exists if HTTP support built into the library */
+XMLPUBFUN void XMLCALL
+ xmlRegisterHTTPPostCallbacks (void );
+#endif /* LIBXML_HTTP_ENABLED */
+
+#endif /* LIBXML_OUTPUT_ENABLED */
+
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlCheckHTTPInput (xmlParserCtxtPtr ctxt,
+ xmlParserInputPtr ret);
+
+/*
+ * A predefined entity loader disabling network accesses
+ */
+XMLPUBFUN xmlParserInputPtr XMLCALL
+ xmlNoNetExternalEntityLoader (const char *URL,
+ const char *ID,
+ xmlParserCtxtPtr ctxt);
+
+/*
+ * xmlNormalizeWindowsPath is obsolete, don't use it.
+ * Check xmlCanonicPath in uri.h for a better alternative.
+ */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlNormalizeWindowsPath (const xmlChar *path);
+
+XMLPUBFUN int XMLCALL
+ xmlCheckFilename (const char *path);
+/**
+ * Default 'file://' protocol callbacks
+ */
+XMLPUBFUN int XMLCALL
+ xmlFileMatch (const char *filename);
+XMLPUBFUN void * XMLCALL
+ xmlFileOpen (const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlFileRead (void * context,
+ char * buffer,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlFileClose (void * context);
+
+/**
+ * Default 'http://' protocol callbacks
+ */
+#ifdef LIBXML_HTTP_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlIOHTTPMatch (const char *filename);
+XMLPUBFUN void * XMLCALL
+ xmlIOHTTPOpen (const char *filename);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void * XMLCALL
+ xmlIOHTTPOpenW (const char * post_uri,
+ int compression );
+#endif /* LIBXML_OUTPUT_ENABLED */
+XMLPUBFUN int XMLCALL
+ xmlIOHTTPRead (void * context,
+ char * buffer,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlIOHTTPClose (void * context);
+#endif /* LIBXML_HTTP_ENABLED */
+
+/**
+ * Default 'ftp://' protocol callbacks
+ */
+#ifdef LIBXML_FTP_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlIOFTPMatch (const char *filename);
+XMLPUBFUN void * XMLCALL
+ xmlIOFTPOpen (const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlIOFTPRead (void * context,
+ char * buffer,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlIOFTPClose (void * context);
+#endif /* LIBXML_FTP_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_IO_H__ */
--- /dev/null
+/*
+ * Summary: API to build regexp automata
+ * Description: the API to build regexp automata
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_AUTOMATA_H__
+#define __XML_AUTOMATA_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+
+#ifdef LIBXML_REGEXP_ENABLED
+#ifdef LIBXML_AUTOMATA_ENABLED
+#include <libxml/xmlregexp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlAutomataPtr:
+ *
+ * A libxml automata description, It can be compiled into a regexp
+ */
+typedef struct _xmlAutomata xmlAutomata;
+typedef xmlAutomata *xmlAutomataPtr;
+
+/**
+ * xmlAutomataStatePtr:
+ *
+ * A state int the automata description,
+ */
+typedef struct _xmlAutomataState xmlAutomataState;
+typedef xmlAutomataState *xmlAutomataStatePtr;
+
+/*
+ * Building API
+ */
+XMLPUBFUN xmlAutomataPtr XMLCALL
+ xmlNewAutomata (void);
+XMLPUBFUN void XMLCALL
+ xmlFreeAutomata (xmlAutomataPtr am);
+
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataGetInitState (xmlAutomataPtr am);
+XMLPUBFUN int XMLCALL
+ xmlAutomataSetFinalState (xmlAutomataPtr am,
+ xmlAutomataStatePtr state);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewState (xmlAutomataPtr am);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewTransition (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewTransition2 (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ const xmlChar *token2,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewNegTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ const xmlChar *token2,
+ void *data);
+
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewCountTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ int min,
+ int max,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewCountTrans2 (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ const xmlChar *token2,
+ int min,
+ int max,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewOnceTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ int min,
+ int max,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewOnceTrans2 (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ const xmlChar *token,
+ const xmlChar *token2,
+ int min,
+ int max,
+ void *data);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewAllTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ int lax);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewEpsilon (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewCountedTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ int counter);
+XMLPUBFUN xmlAutomataStatePtr XMLCALL
+ xmlAutomataNewCounterTrans (xmlAutomataPtr am,
+ xmlAutomataStatePtr from,
+ xmlAutomataStatePtr to,
+ int counter);
+XMLPUBFUN int XMLCALL
+ xmlAutomataNewCounter (xmlAutomataPtr am,
+ int min,
+ int max);
+
+XMLPUBFUN xmlRegexpPtr XMLCALL
+ xmlAutomataCompile (xmlAutomataPtr am);
+XMLPUBFUN int XMLCALL
+ xmlAutomataIsDeterminist (xmlAutomataPtr am);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_AUTOMATA_ENABLED */
+#endif /* LIBXML_REGEXP_ENABLED */
+
+#endif /* __XML_AUTOMATA_H__ */
--- /dev/null
+/*
+ * Summary: error handling
+ * Description: the API used to report errors
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#include <libxml/parser.h>
+
+#ifndef __XML_ERROR_H__
+#define __XML_ERROR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlErrorLevel:
+ *
+ * Indicates the level of an error
+ */
+typedef enum {
+ XML_ERR_NONE = 0,
+ XML_ERR_WARNING = 1, /* A simple warning */
+ XML_ERR_ERROR = 2, /* A recoverable error */
+ XML_ERR_FATAL = 3 /* A fatal error */
+} xmlErrorLevel;
+
+/**
+ * xmlErrorDomain:
+ *
+ * Indicates where an error may have come from
+ */
+typedef enum {
+ XML_FROM_NONE = 0,
+ XML_FROM_PARSER, /* The XML parser */
+ XML_FROM_TREE, /* The tree module */
+ XML_FROM_NAMESPACE, /* The XML Namespace module */
+ XML_FROM_DTD, /* The XML DTD validation with parser context*/
+ XML_FROM_HTML, /* The HTML parser */
+ XML_FROM_MEMORY, /* The memory allocator */
+ XML_FROM_OUTPUT, /* The serialization code */
+ XML_FROM_IO, /* The Input/Output stack */
+ XML_FROM_FTP, /* The FTP module */
+ XML_FROM_HTTP, /* The HTTP module */
+ XML_FROM_XINCLUDE, /* The XInclude processing */
+ XML_FROM_XPATH, /* The XPath module */
+ XML_FROM_XPOINTER, /* The XPointer module */
+ XML_FROM_REGEXP, /* The regular expressions module */
+ XML_FROM_DATATYPE, /* The W3C XML Schemas Datatype module */
+ XML_FROM_SCHEMASP, /* The W3C XML Schemas parser module */
+ XML_FROM_SCHEMASV, /* The W3C XML Schemas validation module */
+ XML_FROM_RELAXNGP, /* The Relax-NG parser module */
+ XML_FROM_RELAXNGV, /* The Relax-NG validator module */
+ XML_FROM_CATALOG, /* The Catalog module */
+ XML_FROM_C14N, /* The Canonicalization module */
+ XML_FROM_XSLT, /* The XSLT engine from libxslt */
+ XML_FROM_VALID, /* The XML DTD validation with valid context */
+ XML_FROM_CHECK, /* The error checking module */
+ XML_FROM_WRITER, /* The xmlwriter module */
+ XML_FROM_MODULE, /* The dynamically loaded module module*/
+ XML_FROM_I18N, /* The module handling character conversion */
+ XML_FROM_SCHEMATRONV,/* The Schematron validator module */
+ XML_FROM_BUFFER, /* The buffers module */
+ XML_FROM_URI /* The URI module */
+} xmlErrorDomain;
+
+/**
+ * xmlError:
+ *
+ * An XML Error instance.
+ */
+
+typedef struct _xmlError xmlError;
+typedef xmlError *xmlErrorPtr;
+struct _xmlError {
+ int domain; /* What part of the library raised this error */
+ int code; /* The error code, e.g. an xmlParserError */
+ char *message;/* human-readable informative error message */
+ xmlErrorLevel level;/* how consequent is the error */
+ char *file; /* the filename */
+ int line; /* the line number if available */
+ char *str1; /* extra string information */
+ char *str2; /* extra string information */
+ char *str3; /* extra string information */
+ int int1; /* extra number information */
+ int int2; /* column number of the error or 0 if N/A (todo: rename this field when we would break ABI) */
+ void *ctxt; /* the parser context if available */
+ void *node; /* the node in the tree */
+};
+
+/**
+ * xmlParserError:
+ *
+ * This is an error that the XML (or HTML) parser can generate
+ */
+typedef enum {
+ XML_ERR_OK = 0,
+ XML_ERR_INTERNAL_ERROR, /* 1 */
+ XML_ERR_NO_MEMORY, /* 2 */
+ XML_ERR_DOCUMENT_START, /* 3 */
+ XML_ERR_DOCUMENT_EMPTY, /* 4 */
+ XML_ERR_DOCUMENT_END, /* 5 */
+ XML_ERR_INVALID_HEX_CHARREF, /* 6 */
+ XML_ERR_INVALID_DEC_CHARREF, /* 7 */
+ XML_ERR_INVALID_CHARREF, /* 8 */
+ XML_ERR_INVALID_CHAR, /* 9 */
+ XML_ERR_CHARREF_AT_EOF, /* 10 */
+ XML_ERR_CHARREF_IN_PROLOG, /* 11 */
+ XML_ERR_CHARREF_IN_EPILOG, /* 12 */
+ XML_ERR_CHARREF_IN_DTD, /* 13 */
+ XML_ERR_ENTITYREF_AT_EOF, /* 14 */
+ XML_ERR_ENTITYREF_IN_PROLOG, /* 15 */
+ XML_ERR_ENTITYREF_IN_EPILOG, /* 16 */
+ XML_ERR_ENTITYREF_IN_DTD, /* 17 */
+ XML_ERR_PEREF_AT_EOF, /* 18 */
+ XML_ERR_PEREF_IN_PROLOG, /* 19 */
+ XML_ERR_PEREF_IN_EPILOG, /* 20 */
+ XML_ERR_PEREF_IN_INT_SUBSET, /* 21 */
+ XML_ERR_ENTITYREF_NO_NAME, /* 22 */
+ XML_ERR_ENTITYREF_SEMICOL_MISSING, /* 23 */
+ XML_ERR_PEREF_NO_NAME, /* 24 */
+ XML_ERR_PEREF_SEMICOL_MISSING, /* 25 */
+ XML_ERR_UNDECLARED_ENTITY, /* 26 */
+ XML_WAR_UNDECLARED_ENTITY, /* 27 */
+ XML_ERR_UNPARSED_ENTITY, /* 28 */
+ XML_ERR_ENTITY_IS_EXTERNAL, /* 29 */
+ XML_ERR_ENTITY_IS_PARAMETER, /* 30 */
+ XML_ERR_UNKNOWN_ENCODING, /* 31 */
+ XML_ERR_UNSUPPORTED_ENCODING, /* 32 */
+ XML_ERR_STRING_NOT_STARTED, /* 33 */
+ XML_ERR_STRING_NOT_CLOSED, /* 34 */
+ XML_ERR_NS_DECL_ERROR, /* 35 */
+ XML_ERR_ENTITY_NOT_STARTED, /* 36 */
+ XML_ERR_ENTITY_NOT_FINISHED, /* 37 */
+ XML_ERR_LT_IN_ATTRIBUTE, /* 38 */
+ XML_ERR_ATTRIBUTE_NOT_STARTED, /* 39 */
+ XML_ERR_ATTRIBUTE_NOT_FINISHED, /* 40 */
+ XML_ERR_ATTRIBUTE_WITHOUT_VALUE, /* 41 */
+ XML_ERR_ATTRIBUTE_REDEFINED, /* 42 */
+ XML_ERR_LITERAL_NOT_STARTED, /* 43 */
+ XML_ERR_LITERAL_NOT_FINISHED, /* 44 */
+ XML_ERR_COMMENT_NOT_FINISHED, /* 45 */
+ XML_ERR_PI_NOT_STARTED, /* 46 */
+ XML_ERR_PI_NOT_FINISHED, /* 47 */
+ XML_ERR_NOTATION_NOT_STARTED, /* 48 */
+ XML_ERR_NOTATION_NOT_FINISHED, /* 49 */
+ XML_ERR_ATTLIST_NOT_STARTED, /* 50 */
+ XML_ERR_ATTLIST_NOT_FINISHED, /* 51 */
+ XML_ERR_MIXED_NOT_STARTED, /* 52 */
+ XML_ERR_MIXED_NOT_FINISHED, /* 53 */
+ XML_ERR_ELEMCONTENT_NOT_STARTED, /* 54 */
+ XML_ERR_ELEMCONTENT_NOT_FINISHED, /* 55 */
+ XML_ERR_XMLDECL_NOT_STARTED, /* 56 */
+ XML_ERR_XMLDECL_NOT_FINISHED, /* 57 */
+ XML_ERR_CONDSEC_NOT_STARTED, /* 58 */
+ XML_ERR_CONDSEC_NOT_FINISHED, /* 59 */
+ XML_ERR_EXT_SUBSET_NOT_FINISHED, /* 60 */
+ XML_ERR_DOCTYPE_NOT_FINISHED, /* 61 */
+ XML_ERR_MISPLACED_CDATA_END, /* 62 */
+ XML_ERR_CDATA_NOT_FINISHED, /* 63 */
+ XML_ERR_RESERVED_XML_NAME, /* 64 */
+ XML_ERR_SPACE_REQUIRED, /* 65 */
+ XML_ERR_SEPARATOR_REQUIRED, /* 66 */
+ XML_ERR_NMTOKEN_REQUIRED, /* 67 */
+ XML_ERR_NAME_REQUIRED, /* 68 */
+ XML_ERR_PCDATA_REQUIRED, /* 69 */
+ XML_ERR_URI_REQUIRED, /* 70 */
+ XML_ERR_PUBID_REQUIRED, /* 71 */
+ XML_ERR_LT_REQUIRED, /* 72 */
+ XML_ERR_GT_REQUIRED, /* 73 */
+ XML_ERR_LTSLASH_REQUIRED, /* 74 */
+ XML_ERR_EQUAL_REQUIRED, /* 75 */
+ XML_ERR_TAG_NAME_MISMATCH, /* 76 */
+ XML_ERR_TAG_NOT_FINISHED, /* 77 */
+ XML_ERR_STANDALONE_VALUE, /* 78 */
+ XML_ERR_ENCODING_NAME, /* 79 */
+ XML_ERR_HYPHEN_IN_COMMENT, /* 80 */
+ XML_ERR_INVALID_ENCODING, /* 81 */
+ XML_ERR_EXT_ENTITY_STANDALONE, /* 82 */
+ XML_ERR_CONDSEC_INVALID, /* 83 */
+ XML_ERR_VALUE_REQUIRED, /* 84 */
+ XML_ERR_NOT_WELL_BALANCED, /* 85 */
+ XML_ERR_EXTRA_CONTENT, /* 86 */
+ XML_ERR_ENTITY_CHAR_ERROR, /* 87 */
+ XML_ERR_ENTITY_PE_INTERNAL, /* 88 */
+ XML_ERR_ENTITY_LOOP, /* 89 */
+ XML_ERR_ENTITY_BOUNDARY, /* 90 */
+ XML_ERR_INVALID_URI, /* 91 */
+ XML_ERR_URI_FRAGMENT, /* 92 */
+ XML_WAR_CATALOG_PI, /* 93 */
+ XML_ERR_NO_DTD, /* 94 */
+ XML_ERR_CONDSEC_INVALID_KEYWORD, /* 95 */
+ XML_ERR_VERSION_MISSING, /* 96 */
+ XML_WAR_UNKNOWN_VERSION, /* 97 */
+ XML_WAR_LANG_VALUE, /* 98 */
+ XML_WAR_NS_URI, /* 99 */
+ XML_WAR_NS_URI_RELATIVE, /* 100 */
+ XML_ERR_MISSING_ENCODING, /* 101 */
+ XML_WAR_SPACE_VALUE, /* 102 */
+ XML_ERR_NOT_STANDALONE, /* 103 */
+ XML_ERR_ENTITY_PROCESSING, /* 104 */
+ XML_ERR_NOTATION_PROCESSING, /* 105 */
+ XML_WAR_NS_COLUMN, /* 106 */
+ XML_WAR_ENTITY_REDEFINED, /* 107 */
+ XML_ERR_UNKNOWN_VERSION, /* 108 */
+ XML_ERR_VERSION_MISMATCH, /* 109 */
+ XML_ERR_NAME_TOO_LONG, /* 110 */
+ XML_ERR_USER_STOP, /* 111 */
+ XML_NS_ERR_XML_NAMESPACE = 200,
+ XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */
+ XML_NS_ERR_QNAME, /* 202 */
+ XML_NS_ERR_ATTRIBUTE_REDEFINED, /* 203 */
+ XML_NS_ERR_EMPTY, /* 204 */
+ XML_NS_ERR_COLON, /* 205 */
+ XML_DTD_ATTRIBUTE_DEFAULT = 500,
+ XML_DTD_ATTRIBUTE_REDEFINED, /* 501 */
+ XML_DTD_ATTRIBUTE_VALUE, /* 502 */
+ XML_DTD_CONTENT_ERROR, /* 503 */
+ XML_DTD_CONTENT_MODEL, /* 504 */
+ XML_DTD_CONTENT_NOT_DETERMINIST, /* 505 */
+ XML_DTD_DIFFERENT_PREFIX, /* 506 */
+ XML_DTD_ELEM_DEFAULT_NAMESPACE, /* 507 */
+ XML_DTD_ELEM_NAMESPACE, /* 508 */
+ XML_DTD_ELEM_REDEFINED, /* 509 */
+ XML_DTD_EMPTY_NOTATION, /* 510 */
+ XML_DTD_ENTITY_TYPE, /* 511 */
+ XML_DTD_ID_FIXED, /* 512 */
+ XML_DTD_ID_REDEFINED, /* 513 */
+ XML_DTD_ID_SUBSET, /* 514 */
+ XML_DTD_INVALID_CHILD, /* 515 */
+ XML_DTD_INVALID_DEFAULT, /* 516 */
+ XML_DTD_LOAD_ERROR, /* 517 */
+ XML_DTD_MISSING_ATTRIBUTE, /* 518 */
+ XML_DTD_MIXED_CORRUPT, /* 519 */
+ XML_DTD_MULTIPLE_ID, /* 520 */
+ XML_DTD_NO_DOC, /* 521 */
+ XML_DTD_NO_DTD, /* 522 */
+ XML_DTD_NO_ELEM_NAME, /* 523 */
+ XML_DTD_NO_PREFIX, /* 524 */
+ XML_DTD_NO_ROOT, /* 525 */
+ XML_DTD_NOTATION_REDEFINED, /* 526 */
+ XML_DTD_NOTATION_VALUE, /* 527 */
+ XML_DTD_NOT_EMPTY, /* 528 */
+ XML_DTD_NOT_PCDATA, /* 529 */
+ XML_DTD_NOT_STANDALONE, /* 530 */
+ XML_DTD_ROOT_NAME, /* 531 */
+ XML_DTD_STANDALONE_WHITE_SPACE, /* 532 */
+ XML_DTD_UNKNOWN_ATTRIBUTE, /* 533 */
+ XML_DTD_UNKNOWN_ELEM, /* 534 */
+ XML_DTD_UNKNOWN_ENTITY, /* 535 */
+ XML_DTD_UNKNOWN_ID, /* 536 */
+ XML_DTD_UNKNOWN_NOTATION, /* 537 */
+ XML_DTD_STANDALONE_DEFAULTED, /* 538 */
+ XML_DTD_XMLID_VALUE, /* 539 */
+ XML_DTD_XMLID_TYPE, /* 540 */
+ XML_DTD_DUP_TOKEN, /* 541 */
+ XML_HTML_STRUCURE_ERROR = 800,
+ XML_HTML_UNKNOWN_TAG, /* 801 */
+ XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000,
+ XML_RNGP_ATTR_CONFLICT, /* 1001 */
+ XML_RNGP_ATTRIBUTE_CHILDREN, /* 1002 */
+ XML_RNGP_ATTRIBUTE_CONTENT, /* 1003 */
+ XML_RNGP_ATTRIBUTE_EMPTY, /* 1004 */
+ XML_RNGP_ATTRIBUTE_NOOP, /* 1005 */
+ XML_RNGP_CHOICE_CONTENT, /* 1006 */
+ XML_RNGP_CHOICE_EMPTY, /* 1007 */
+ XML_RNGP_CREATE_FAILURE, /* 1008 */
+ XML_RNGP_DATA_CONTENT, /* 1009 */
+ XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, /* 1010 */
+ XML_RNGP_DEFINE_CREATE_FAILED, /* 1011 */
+ XML_RNGP_DEFINE_EMPTY, /* 1012 */
+ XML_RNGP_DEFINE_MISSING, /* 1013 */
+ XML_RNGP_DEFINE_NAME_MISSING, /* 1014 */
+ XML_RNGP_ELEM_CONTENT_EMPTY, /* 1015 */
+ XML_RNGP_ELEM_CONTENT_ERROR, /* 1016 */
+ XML_RNGP_ELEMENT_EMPTY, /* 1017 */
+ XML_RNGP_ELEMENT_CONTENT, /* 1018 */
+ XML_RNGP_ELEMENT_NAME, /* 1019 */
+ XML_RNGP_ELEMENT_NO_CONTENT, /* 1020 */
+ XML_RNGP_ELEM_TEXT_CONFLICT, /* 1021 */
+ XML_RNGP_EMPTY, /* 1022 */
+ XML_RNGP_EMPTY_CONSTRUCT, /* 1023 */
+ XML_RNGP_EMPTY_CONTENT, /* 1024 */
+ XML_RNGP_EMPTY_NOT_EMPTY, /* 1025 */
+ XML_RNGP_ERROR_TYPE_LIB, /* 1026 */
+ XML_RNGP_EXCEPT_EMPTY, /* 1027 */
+ XML_RNGP_EXCEPT_MISSING, /* 1028 */
+ XML_RNGP_EXCEPT_MULTIPLE, /* 1029 */
+ XML_RNGP_EXCEPT_NO_CONTENT, /* 1030 */
+ XML_RNGP_EXTERNALREF_EMTPY, /* 1031 */
+ XML_RNGP_EXTERNAL_REF_FAILURE, /* 1032 */
+ XML_RNGP_EXTERNALREF_RECURSE, /* 1033 */
+ XML_RNGP_FORBIDDEN_ATTRIBUTE, /* 1034 */
+ XML_RNGP_FOREIGN_ELEMENT, /* 1035 */
+ XML_RNGP_GRAMMAR_CONTENT, /* 1036 */
+ XML_RNGP_GRAMMAR_EMPTY, /* 1037 */
+ XML_RNGP_GRAMMAR_MISSING, /* 1038 */
+ XML_RNGP_GRAMMAR_NO_START, /* 1039 */
+ XML_RNGP_GROUP_ATTR_CONFLICT, /* 1040 */
+ XML_RNGP_HREF_ERROR, /* 1041 */
+ XML_RNGP_INCLUDE_EMPTY, /* 1042 */
+ XML_RNGP_INCLUDE_FAILURE, /* 1043 */
+ XML_RNGP_INCLUDE_RECURSE, /* 1044 */
+ XML_RNGP_INTERLEAVE_ADD, /* 1045 */
+ XML_RNGP_INTERLEAVE_CREATE_FAILED, /* 1046 */
+ XML_RNGP_INTERLEAVE_EMPTY, /* 1047 */
+ XML_RNGP_INTERLEAVE_NO_CONTENT, /* 1048 */
+ XML_RNGP_INVALID_DEFINE_NAME, /* 1049 */
+ XML_RNGP_INVALID_URI, /* 1050 */
+ XML_RNGP_INVALID_VALUE, /* 1051 */
+ XML_RNGP_MISSING_HREF, /* 1052 */
+ XML_RNGP_NAME_MISSING, /* 1053 */
+ XML_RNGP_NEED_COMBINE, /* 1054 */
+ XML_RNGP_NOTALLOWED_NOT_EMPTY, /* 1055 */
+ XML_RNGP_NSNAME_ATTR_ANCESTOR, /* 1056 */
+ XML_RNGP_NSNAME_NO_NS, /* 1057 */
+ XML_RNGP_PARAM_FORBIDDEN, /* 1058 */
+ XML_RNGP_PARAM_NAME_MISSING, /* 1059 */
+ XML_RNGP_PARENTREF_CREATE_FAILED, /* 1060 */
+ XML_RNGP_PARENTREF_NAME_INVALID, /* 1061 */
+ XML_RNGP_PARENTREF_NO_NAME, /* 1062 */
+ XML_RNGP_PARENTREF_NO_PARENT, /* 1063 */
+ XML_RNGP_PARENTREF_NOT_EMPTY, /* 1064 */
+ XML_RNGP_PARSE_ERROR, /* 1065 */
+ XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, /* 1066 */
+ XML_RNGP_PAT_ATTR_ATTR, /* 1067 */
+ XML_RNGP_PAT_ATTR_ELEM, /* 1068 */
+ XML_RNGP_PAT_DATA_EXCEPT_ATTR, /* 1069 */
+ XML_RNGP_PAT_DATA_EXCEPT_ELEM, /* 1070 */
+ XML_RNGP_PAT_DATA_EXCEPT_EMPTY, /* 1071 */
+ XML_RNGP_PAT_DATA_EXCEPT_GROUP, /* 1072 */
+ XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, /* 1073 */
+ XML_RNGP_PAT_DATA_EXCEPT_LIST, /* 1074 */
+ XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, /* 1075 */
+ XML_RNGP_PAT_DATA_EXCEPT_REF, /* 1076 */
+ XML_RNGP_PAT_DATA_EXCEPT_TEXT, /* 1077 */
+ XML_RNGP_PAT_LIST_ATTR, /* 1078 */
+ XML_RNGP_PAT_LIST_ELEM, /* 1079 */
+ XML_RNGP_PAT_LIST_INTERLEAVE, /* 1080 */
+ XML_RNGP_PAT_LIST_LIST, /* 1081 */
+ XML_RNGP_PAT_LIST_REF, /* 1082 */
+ XML_RNGP_PAT_LIST_TEXT, /* 1083 */
+ XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, /* 1084 */
+ XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, /* 1085 */
+ XML_RNGP_PAT_ONEMORE_GROUP_ATTR, /* 1086 */
+ XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, /* 1087 */
+ XML_RNGP_PAT_START_ATTR, /* 1088 */
+ XML_RNGP_PAT_START_DATA, /* 1089 */
+ XML_RNGP_PAT_START_EMPTY, /* 1090 */
+ XML_RNGP_PAT_START_GROUP, /* 1091 */
+ XML_RNGP_PAT_START_INTERLEAVE, /* 1092 */
+ XML_RNGP_PAT_START_LIST, /* 1093 */
+ XML_RNGP_PAT_START_ONEMORE, /* 1094 */
+ XML_RNGP_PAT_START_TEXT, /* 1095 */
+ XML_RNGP_PAT_START_VALUE, /* 1096 */
+ XML_RNGP_PREFIX_UNDEFINED, /* 1097 */
+ XML_RNGP_REF_CREATE_FAILED, /* 1098 */
+ XML_RNGP_REF_CYCLE, /* 1099 */
+ XML_RNGP_REF_NAME_INVALID, /* 1100 */
+ XML_RNGP_REF_NO_DEF, /* 1101 */
+ XML_RNGP_REF_NO_NAME, /* 1102 */
+ XML_RNGP_REF_NOT_EMPTY, /* 1103 */
+ XML_RNGP_START_CHOICE_AND_INTERLEAVE, /* 1104 */
+ XML_RNGP_START_CONTENT, /* 1105 */
+ XML_RNGP_START_EMPTY, /* 1106 */
+ XML_RNGP_START_MISSING, /* 1107 */
+ XML_RNGP_TEXT_EXPECTED, /* 1108 */
+ XML_RNGP_TEXT_HAS_CHILD, /* 1109 */
+ XML_RNGP_TYPE_MISSING, /* 1110 */
+ XML_RNGP_TYPE_NOT_FOUND, /* 1111 */
+ XML_RNGP_TYPE_VALUE, /* 1112 */
+ XML_RNGP_UNKNOWN_ATTRIBUTE, /* 1113 */
+ XML_RNGP_UNKNOWN_COMBINE, /* 1114 */
+ XML_RNGP_UNKNOWN_CONSTRUCT, /* 1115 */
+ XML_RNGP_UNKNOWN_TYPE_LIB, /* 1116 */
+ XML_RNGP_URI_FRAGMENT, /* 1117 */
+ XML_RNGP_URI_NOT_ABSOLUTE, /* 1118 */
+ XML_RNGP_VALUE_EMPTY, /* 1119 */
+ XML_RNGP_VALUE_NO_CONTENT, /* 1120 */
+ XML_RNGP_XMLNS_NAME, /* 1121 */
+ XML_RNGP_XML_NS, /* 1122 */
+ XML_XPATH_EXPRESSION_OK = 1200,
+ XML_XPATH_NUMBER_ERROR, /* 1201 */
+ XML_XPATH_UNFINISHED_LITERAL_ERROR, /* 1202 */
+ XML_XPATH_START_LITERAL_ERROR, /* 1203 */
+ XML_XPATH_VARIABLE_REF_ERROR, /* 1204 */
+ XML_XPATH_UNDEF_VARIABLE_ERROR, /* 1205 */
+ XML_XPATH_INVALID_PREDICATE_ERROR, /* 1206 */
+ XML_XPATH_EXPR_ERROR, /* 1207 */
+ XML_XPATH_UNCLOSED_ERROR, /* 1208 */
+ XML_XPATH_UNKNOWN_FUNC_ERROR, /* 1209 */
+ XML_XPATH_INVALID_OPERAND, /* 1210 */
+ XML_XPATH_INVALID_TYPE, /* 1211 */
+ XML_XPATH_INVALID_ARITY, /* 1212 */
+ XML_XPATH_INVALID_CTXT_SIZE, /* 1213 */
+ XML_XPATH_INVALID_CTXT_POSITION, /* 1214 */
+ XML_XPATH_MEMORY_ERROR, /* 1215 */
+ XML_XPTR_SYNTAX_ERROR, /* 1216 */
+ XML_XPTR_RESOURCE_ERROR, /* 1217 */
+ XML_XPTR_SUB_RESOURCE_ERROR, /* 1218 */
+ XML_XPATH_UNDEF_PREFIX_ERROR, /* 1219 */
+ XML_XPATH_ENCODING_ERROR, /* 1220 */
+ XML_XPATH_INVALID_CHAR_ERROR, /* 1221 */
+ XML_TREE_INVALID_HEX = 1300,
+ XML_TREE_INVALID_DEC, /* 1301 */
+ XML_TREE_UNTERMINATED_ENTITY, /* 1302 */
+ XML_TREE_NOT_UTF8, /* 1303 */
+ XML_SAVE_NOT_UTF8 = 1400,
+ XML_SAVE_CHAR_INVALID, /* 1401 */
+ XML_SAVE_NO_DOCTYPE, /* 1402 */
+ XML_SAVE_UNKNOWN_ENCODING, /* 1403 */
+ XML_REGEXP_COMPILE_ERROR = 1450,
+ XML_IO_UNKNOWN = 1500,
+ XML_IO_EACCES, /* 1501 */
+ XML_IO_EAGAIN, /* 1502 */
+ XML_IO_EBADF, /* 1503 */
+ XML_IO_EBADMSG, /* 1504 */
+ XML_IO_EBUSY, /* 1505 */
+ XML_IO_ECANCELED, /* 1506 */
+ XML_IO_ECHILD, /* 1507 */
+ XML_IO_EDEADLK, /* 1508 */
+ XML_IO_EDOM, /* 1509 */
+ XML_IO_EEXIST, /* 1510 */
+ XML_IO_EFAULT, /* 1511 */
+ XML_IO_EFBIG, /* 1512 */
+ XML_IO_EINPROGRESS, /* 1513 */
+ XML_IO_EINTR, /* 1514 */
+ XML_IO_EINVAL, /* 1515 */
+ XML_IO_EIO, /* 1516 */
+ XML_IO_EISDIR, /* 1517 */
+ XML_IO_EMFILE, /* 1518 */
+ XML_IO_EMLINK, /* 1519 */
+ XML_IO_EMSGSIZE, /* 1520 */
+ XML_IO_ENAMETOOLONG, /* 1521 */
+ XML_IO_ENFILE, /* 1522 */
+ XML_IO_ENODEV, /* 1523 */
+ XML_IO_ENOENT, /* 1524 */
+ XML_IO_ENOEXEC, /* 1525 */
+ XML_IO_ENOLCK, /* 1526 */
+ XML_IO_ENOMEM, /* 1527 */
+ XML_IO_ENOSPC, /* 1528 */
+ XML_IO_ENOSYS, /* 1529 */
+ XML_IO_ENOTDIR, /* 1530 */
+ XML_IO_ENOTEMPTY, /* 1531 */
+ XML_IO_ENOTSUP, /* 1532 */
+ XML_IO_ENOTTY, /* 1533 */
+ XML_IO_ENXIO, /* 1534 */
+ XML_IO_EPERM, /* 1535 */
+ XML_IO_EPIPE, /* 1536 */
+ XML_IO_ERANGE, /* 1537 */
+ XML_IO_EROFS, /* 1538 */
+ XML_IO_ESPIPE, /* 1539 */
+ XML_IO_ESRCH, /* 1540 */
+ XML_IO_ETIMEDOUT, /* 1541 */
+ XML_IO_EXDEV, /* 1542 */
+ XML_IO_NETWORK_ATTEMPT, /* 1543 */
+ XML_IO_ENCODER, /* 1544 */
+ XML_IO_FLUSH, /* 1545 */
+ XML_IO_WRITE, /* 1546 */
+ XML_IO_NO_INPUT, /* 1547 */
+ XML_IO_BUFFER_FULL, /* 1548 */
+ XML_IO_LOAD_ERROR, /* 1549 */
+ XML_IO_ENOTSOCK, /* 1550 */
+ XML_IO_EISCONN, /* 1551 */
+ XML_IO_ECONNREFUSED, /* 1552 */
+ XML_IO_ENETUNREACH, /* 1553 */
+ XML_IO_EADDRINUSE, /* 1554 */
+ XML_IO_EALREADY, /* 1555 */
+ XML_IO_EAFNOSUPPORT, /* 1556 */
+ XML_XINCLUDE_RECURSION=1600,
+ XML_XINCLUDE_PARSE_VALUE, /* 1601 */
+ XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */
+ XML_XINCLUDE_NO_HREF, /* 1603 */
+ XML_XINCLUDE_NO_FALLBACK, /* 1604 */
+ XML_XINCLUDE_HREF_URI, /* 1605 */
+ XML_XINCLUDE_TEXT_FRAGMENT, /* 1606 */
+ XML_XINCLUDE_TEXT_DOCUMENT, /* 1607 */
+ XML_XINCLUDE_INVALID_CHAR, /* 1608 */
+ XML_XINCLUDE_BUILD_FAILED, /* 1609 */
+ XML_XINCLUDE_UNKNOWN_ENCODING, /* 1610 */
+ XML_XINCLUDE_MULTIPLE_ROOT, /* 1611 */
+ XML_XINCLUDE_XPTR_FAILED, /* 1612 */
+ XML_XINCLUDE_XPTR_RESULT, /* 1613 */
+ XML_XINCLUDE_INCLUDE_IN_INCLUDE, /* 1614 */
+ XML_XINCLUDE_FALLBACKS_IN_INCLUDE, /* 1615 */
+ XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, /* 1616 */
+ XML_XINCLUDE_DEPRECATED_NS, /* 1617 */
+ XML_XINCLUDE_FRAGMENT_ID, /* 1618 */
+ XML_CATALOG_MISSING_ATTR = 1650,
+ XML_CATALOG_ENTRY_BROKEN, /* 1651 */
+ XML_CATALOG_PREFER_VALUE, /* 1652 */
+ XML_CATALOG_NOT_CATALOG, /* 1653 */
+ XML_CATALOG_RECURSION, /* 1654 */
+ XML_SCHEMAP_PREFIX_UNDEFINED = 1700,
+ XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, /* 1701 */
+ XML_SCHEMAP_ATTRGRP_NONAME_NOREF, /* 1702 */
+ XML_SCHEMAP_ATTR_NONAME_NOREF, /* 1703 */
+ XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF, /* 1704 */
+ XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, /* 1705 */
+ XML_SCHEMAP_ELEM_NONAME_NOREF, /* 1706 */
+ XML_SCHEMAP_EXTENSION_NO_BASE, /* 1707 */
+ XML_SCHEMAP_FACET_NO_VALUE, /* 1708 */
+ XML_SCHEMAP_FAILED_BUILD_IMPORT, /* 1709 */
+ XML_SCHEMAP_GROUP_NONAME_NOREF, /* 1710 */
+ XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI, /* 1711 */
+ XML_SCHEMAP_IMPORT_REDEFINE_NSNAME, /* 1712 */
+ XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI, /* 1713 */
+ XML_SCHEMAP_INVALID_BOOLEAN, /* 1714 */
+ XML_SCHEMAP_INVALID_ENUM, /* 1715 */
+ XML_SCHEMAP_INVALID_FACET, /* 1716 */
+ XML_SCHEMAP_INVALID_FACET_VALUE, /* 1717 */
+ XML_SCHEMAP_INVALID_MAXOCCURS, /* 1718 */
+ XML_SCHEMAP_INVALID_MINOCCURS, /* 1719 */
+ XML_SCHEMAP_INVALID_REF_AND_SUBTYPE, /* 1720 */
+ XML_SCHEMAP_INVALID_WHITE_SPACE, /* 1721 */
+ XML_SCHEMAP_NOATTR_NOREF, /* 1722 */
+ XML_SCHEMAP_NOTATION_NO_NAME, /* 1723 */
+ XML_SCHEMAP_NOTYPE_NOREF, /* 1724 */
+ XML_SCHEMAP_REF_AND_SUBTYPE, /* 1725 */
+ XML_SCHEMAP_RESTRICTION_NONAME_NOREF, /* 1726 */
+ XML_SCHEMAP_SIMPLETYPE_NONAME, /* 1727 */
+ XML_SCHEMAP_TYPE_AND_SUBTYPE, /* 1728 */
+ XML_SCHEMAP_UNKNOWN_ALL_CHILD, /* 1729 */
+ XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD, /* 1730 */
+ XML_SCHEMAP_UNKNOWN_ATTR_CHILD, /* 1731 */
+ XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD, /* 1732 */
+ XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP, /* 1733 */
+ XML_SCHEMAP_UNKNOWN_BASE_TYPE, /* 1734 */
+ XML_SCHEMAP_UNKNOWN_CHOICE_CHILD, /* 1735 */
+ XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD, /* 1736 */
+ XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD, /* 1737 */
+ XML_SCHEMAP_UNKNOWN_ELEM_CHILD, /* 1738 */
+ XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD, /* 1739 */
+ XML_SCHEMAP_UNKNOWN_FACET_CHILD, /* 1740 */
+ XML_SCHEMAP_UNKNOWN_FACET_TYPE, /* 1741 */
+ XML_SCHEMAP_UNKNOWN_GROUP_CHILD, /* 1742 */
+ XML_SCHEMAP_UNKNOWN_IMPORT_CHILD, /* 1743 */
+ XML_SCHEMAP_UNKNOWN_LIST_CHILD, /* 1744 */
+ XML_SCHEMAP_UNKNOWN_NOTATION_CHILD, /* 1745 */
+ XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD, /* 1746 */
+ XML_SCHEMAP_UNKNOWN_REF, /* 1747 */
+ XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD, /* 1748 */
+ XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD, /* 1749 */
+ XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD, /* 1750 */
+ XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD, /* 1751 */
+ XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD, /* 1752 */
+ XML_SCHEMAP_UNKNOWN_TYPE, /* 1753 */
+ XML_SCHEMAP_UNKNOWN_UNION_CHILD, /* 1754 */
+ XML_SCHEMAP_ELEM_DEFAULT_FIXED, /* 1755 */
+ XML_SCHEMAP_REGEXP_INVALID, /* 1756 */
+ XML_SCHEMAP_FAILED_LOAD, /* 1757 */
+ XML_SCHEMAP_NOTHING_TO_PARSE, /* 1758 */
+ XML_SCHEMAP_NOROOT, /* 1759 */
+ XML_SCHEMAP_REDEFINED_GROUP, /* 1760 */
+ XML_SCHEMAP_REDEFINED_TYPE, /* 1761 */
+ XML_SCHEMAP_REDEFINED_ELEMENT, /* 1762 */
+ XML_SCHEMAP_REDEFINED_ATTRGROUP, /* 1763 */
+ XML_SCHEMAP_REDEFINED_ATTR, /* 1764 */
+ XML_SCHEMAP_REDEFINED_NOTATION, /* 1765 */
+ XML_SCHEMAP_FAILED_PARSE, /* 1766 */
+ XML_SCHEMAP_UNKNOWN_PREFIX, /* 1767 */
+ XML_SCHEMAP_DEF_AND_PREFIX, /* 1768 */
+ XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD, /* 1769 */
+ XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI, /* 1770 */
+ XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI, /* 1771 */
+ XML_SCHEMAP_NOT_SCHEMA, /* 1772 */
+ XML_SCHEMAP_UNKNOWN_MEMBER_TYPE, /* 1773 */
+ XML_SCHEMAP_INVALID_ATTR_USE, /* 1774 */
+ XML_SCHEMAP_RECURSIVE, /* 1775 */
+ XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE, /* 1776 */
+ XML_SCHEMAP_INVALID_ATTR_COMBINATION, /* 1777 */
+ XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION, /* 1778 */
+ XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD, /* 1779 */
+ XML_SCHEMAP_INVALID_ATTR_NAME, /* 1780 */
+ XML_SCHEMAP_REF_AND_CONTENT, /* 1781 */
+ XML_SCHEMAP_CT_PROPS_CORRECT_1, /* 1782 */
+ XML_SCHEMAP_CT_PROPS_CORRECT_2, /* 1783 */
+ XML_SCHEMAP_CT_PROPS_CORRECT_3, /* 1784 */
+ XML_SCHEMAP_CT_PROPS_CORRECT_4, /* 1785 */
+ XML_SCHEMAP_CT_PROPS_CORRECT_5, /* 1786 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, /* 1787 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, /* 1788 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, /* 1789 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, /* 1790 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, /* 1791 */
+ XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, /* 1792 */
+ XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, /* 1793 */
+ XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, /* 1794 */
+ XML_SCHEMAP_SRC_IMPORT_3_1, /* 1795 */
+ XML_SCHEMAP_SRC_IMPORT_3_2, /* 1796 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, /* 1797 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, /* 1798 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, /* 1799 */
+ XML_SCHEMAP_COS_CT_EXTENDS_1_3, /* 1800 */
+ XML_SCHEMAV_NOROOT = 1801,
+ XML_SCHEMAV_UNDECLAREDELEM, /* 1802 */
+ XML_SCHEMAV_NOTTOPLEVEL, /* 1803 */
+ XML_SCHEMAV_MISSING, /* 1804 */
+ XML_SCHEMAV_WRONGELEM, /* 1805 */
+ XML_SCHEMAV_NOTYPE, /* 1806 */
+ XML_SCHEMAV_NOROLLBACK, /* 1807 */
+ XML_SCHEMAV_ISABSTRACT, /* 1808 */
+ XML_SCHEMAV_NOTEMPTY, /* 1809 */
+ XML_SCHEMAV_ELEMCONT, /* 1810 */
+ XML_SCHEMAV_HAVEDEFAULT, /* 1811 */
+ XML_SCHEMAV_NOTNILLABLE, /* 1812 */
+ XML_SCHEMAV_EXTRACONTENT, /* 1813 */
+ XML_SCHEMAV_INVALIDATTR, /* 1814 */
+ XML_SCHEMAV_INVALIDELEM, /* 1815 */
+ XML_SCHEMAV_NOTDETERMINIST, /* 1816 */
+ XML_SCHEMAV_CONSTRUCT, /* 1817 */
+ XML_SCHEMAV_INTERNAL, /* 1818 */
+ XML_SCHEMAV_NOTSIMPLE, /* 1819 */
+ XML_SCHEMAV_ATTRUNKNOWN, /* 1820 */
+ XML_SCHEMAV_ATTRINVALID, /* 1821 */
+ XML_SCHEMAV_VALUE, /* 1822 */
+ XML_SCHEMAV_FACET, /* 1823 */
+ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, /* 1824 */
+ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2, /* 1825 */
+ XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3, /* 1826 */
+ XML_SCHEMAV_CVC_TYPE_3_1_1, /* 1827 */
+ XML_SCHEMAV_CVC_TYPE_3_1_2, /* 1828 */
+ XML_SCHEMAV_CVC_FACET_VALID, /* 1829 */
+ XML_SCHEMAV_CVC_LENGTH_VALID, /* 1830 */
+ XML_SCHEMAV_CVC_MINLENGTH_VALID, /* 1831 */
+ XML_SCHEMAV_CVC_MAXLENGTH_VALID, /* 1832 */
+ XML_SCHEMAV_CVC_MININCLUSIVE_VALID, /* 1833 */
+ XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID, /* 1834 */
+ XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID, /* 1835 */
+ XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID, /* 1836 */
+ XML_SCHEMAV_CVC_TOTALDIGITS_VALID, /* 1837 */
+ XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID, /* 1838 */
+ XML_SCHEMAV_CVC_PATTERN_VALID, /* 1839 */
+ XML_SCHEMAV_CVC_ENUMERATION_VALID, /* 1840 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, /* 1841 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2, /* 1842 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, /* 1843 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4, /* 1844 */
+ XML_SCHEMAV_CVC_ELT_1, /* 1845 */
+ XML_SCHEMAV_CVC_ELT_2, /* 1846 */
+ XML_SCHEMAV_CVC_ELT_3_1, /* 1847 */
+ XML_SCHEMAV_CVC_ELT_3_2_1, /* 1848 */
+ XML_SCHEMAV_CVC_ELT_3_2_2, /* 1849 */
+ XML_SCHEMAV_CVC_ELT_4_1, /* 1850 */
+ XML_SCHEMAV_CVC_ELT_4_2, /* 1851 */
+ XML_SCHEMAV_CVC_ELT_4_3, /* 1852 */
+ XML_SCHEMAV_CVC_ELT_5_1_1, /* 1853 */
+ XML_SCHEMAV_CVC_ELT_5_1_2, /* 1854 */
+ XML_SCHEMAV_CVC_ELT_5_2_1, /* 1855 */
+ XML_SCHEMAV_CVC_ELT_5_2_2_1, /* 1856 */
+ XML_SCHEMAV_CVC_ELT_5_2_2_2_1, /* 1857 */
+ XML_SCHEMAV_CVC_ELT_5_2_2_2_2, /* 1858 */
+ XML_SCHEMAV_CVC_ELT_6, /* 1859 */
+ XML_SCHEMAV_CVC_ELT_7, /* 1860 */
+ XML_SCHEMAV_CVC_ATTRIBUTE_1, /* 1861 */
+ XML_SCHEMAV_CVC_ATTRIBUTE_2, /* 1862 */
+ XML_SCHEMAV_CVC_ATTRIBUTE_3, /* 1863 */
+ XML_SCHEMAV_CVC_ATTRIBUTE_4, /* 1864 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1, /* 1865 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, /* 1866 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, /* 1867 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_4, /* 1868 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1, /* 1869 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2, /* 1870 */
+ XML_SCHEMAV_ELEMENT_CONTENT, /* 1871 */
+ XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, /* 1872 */
+ XML_SCHEMAV_CVC_COMPLEX_TYPE_1, /* 1873 */
+ XML_SCHEMAV_CVC_AU, /* 1874 */
+ XML_SCHEMAV_CVC_TYPE_1, /* 1875 */
+ XML_SCHEMAV_CVC_TYPE_2, /* 1876 */
+ XML_SCHEMAV_CVC_IDC, /* 1877 */
+ XML_SCHEMAV_CVC_WILDCARD, /* 1878 */
+ XML_SCHEMAV_MISC, /* 1879 */
+ XML_XPTR_UNKNOWN_SCHEME = 1900,
+ XML_XPTR_CHILDSEQ_START, /* 1901 */
+ XML_XPTR_EVAL_FAILED, /* 1902 */
+ XML_XPTR_EXTRA_OBJECTS, /* 1903 */
+ XML_C14N_CREATE_CTXT = 1950,
+ XML_C14N_REQUIRES_UTF8, /* 1951 */
+ XML_C14N_CREATE_STACK, /* 1952 */
+ XML_C14N_INVALID_NODE, /* 1953 */
+ XML_C14N_UNKNOW_NODE, /* 1954 */
+ XML_C14N_RELATIVE_NAMESPACE, /* 1955 */
+ XML_FTP_PASV_ANSWER = 2000,
+ XML_FTP_EPSV_ANSWER, /* 2001 */
+ XML_FTP_ACCNT, /* 2002 */
+ XML_FTP_URL_SYNTAX, /* 2003 */
+ XML_HTTP_URL_SYNTAX = 2020,
+ XML_HTTP_USE_IP, /* 2021 */
+ XML_HTTP_UNKNOWN_HOST, /* 2022 */
+ XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000,
+ XML_SCHEMAP_SRC_SIMPLE_TYPE_2, /* 3001 */
+ XML_SCHEMAP_SRC_SIMPLE_TYPE_3, /* 3002 */
+ XML_SCHEMAP_SRC_SIMPLE_TYPE_4, /* 3003 */
+ XML_SCHEMAP_SRC_RESOLVE, /* 3004 */
+ XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, /* 3005 */
+ XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE, /* 3006 */
+ XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, /* 3007 */
+ XML_SCHEMAP_ST_PROPS_CORRECT_1, /* 3008 */
+ XML_SCHEMAP_ST_PROPS_CORRECT_2, /* 3009 */
+ XML_SCHEMAP_ST_PROPS_CORRECT_3, /* 3010 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_1_1, /* 3011 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_1_2, /* 3012 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, /* 3013 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2, /* 3014 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_1, /* 3015 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1, /* 3016 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, /* 3017 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, /* 3018 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, /* 3019 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, /* 3020 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, /* 3021 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5, /* 3022 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_1, /* 3023 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, /* 3024 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, /* 3025 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, /* 3026 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, /* 3027 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, /* 3028 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, /* 3029 */
+ XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5, /* 3030 */
+ XML_SCHEMAP_COS_ST_DERIVED_OK_2_1, /* 3031 */
+ XML_SCHEMAP_COS_ST_DERIVED_OK_2_2, /* 3032 */
+ XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, /* 3033 */
+ XML_SCHEMAP_S4S_ELEM_MISSING, /* 3034 */
+ XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, /* 3035 */
+ XML_SCHEMAP_S4S_ATTR_MISSING, /* 3036 */
+ XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* 3037 */
+ XML_SCHEMAP_SRC_ELEMENT_1, /* 3038 */
+ XML_SCHEMAP_SRC_ELEMENT_2_1, /* 3039 */
+ XML_SCHEMAP_SRC_ELEMENT_2_2, /* 3040 */
+ XML_SCHEMAP_SRC_ELEMENT_3, /* 3041 */
+ XML_SCHEMAP_P_PROPS_CORRECT_1, /* 3042 */
+ XML_SCHEMAP_P_PROPS_CORRECT_2_1, /* 3043 */
+ XML_SCHEMAP_P_PROPS_CORRECT_2_2, /* 3044 */
+ XML_SCHEMAP_E_PROPS_CORRECT_2, /* 3045 */
+ XML_SCHEMAP_E_PROPS_CORRECT_3, /* 3046 */
+ XML_SCHEMAP_E_PROPS_CORRECT_4, /* 3047 */
+ XML_SCHEMAP_E_PROPS_CORRECT_5, /* 3048 */
+ XML_SCHEMAP_E_PROPS_CORRECT_6, /* 3049 */
+ XML_SCHEMAP_SRC_INCLUDE, /* 3050 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_1, /* 3051 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_2, /* 3052 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_3_1, /* 3053 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_3_2, /* 3054 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_4, /* 3055 */
+ XML_SCHEMAP_NO_XMLNS, /* 3056 */
+ XML_SCHEMAP_NO_XSI, /* 3057 */
+ XML_SCHEMAP_COS_VALID_DEFAULT_1, /* 3058 */
+ XML_SCHEMAP_COS_VALID_DEFAULT_2_1, /* 3059 */
+ XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1, /* 3060 */
+ XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2, /* 3061 */
+ XML_SCHEMAP_CVC_SIMPLE_TYPE, /* 3062 */
+ XML_SCHEMAP_COS_CT_EXTENDS_1_1, /* 3063 */
+ XML_SCHEMAP_SRC_IMPORT_1_1, /* 3064 */
+ XML_SCHEMAP_SRC_IMPORT_1_2, /* 3065 */
+ XML_SCHEMAP_SRC_IMPORT_2, /* 3066 */
+ XML_SCHEMAP_SRC_IMPORT_2_1, /* 3067 */
+ XML_SCHEMAP_SRC_IMPORT_2_2, /* 3068 */
+ XML_SCHEMAP_INTERNAL, /* 3069 non-W3C */
+ XML_SCHEMAP_NOT_DETERMINISTIC, /* 3070 non-W3C */
+ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1, /* 3071 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2, /* 3072 */
+ XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, /* 3073 */
+ XML_SCHEMAP_MG_PROPS_CORRECT_1, /* 3074 */
+ XML_SCHEMAP_MG_PROPS_CORRECT_2, /* 3075 */
+ XML_SCHEMAP_SRC_CT_1, /* 3076 */
+ XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, /* 3077 */
+ XML_SCHEMAP_AU_PROPS_CORRECT_2, /* 3078 */
+ XML_SCHEMAP_A_PROPS_CORRECT_2, /* 3079 */
+ XML_SCHEMAP_C_PROPS_CORRECT, /* 3080 */
+ XML_SCHEMAP_SRC_REDEFINE, /* 3081 */
+ XML_SCHEMAP_SRC_IMPORT, /* 3082 */
+ XML_SCHEMAP_WARN_SKIP_SCHEMA, /* 3083 */
+ XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, /* 3084 */
+ XML_SCHEMAP_WARN_ATTR_REDECL_PROH, /* 3085 */
+ XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, /* 3085 */
+ XML_SCHEMAP_AG_PROPS_CORRECT, /* 3086 */
+ XML_SCHEMAP_COS_CT_EXTENDS_1_2, /* 3087 */
+ XML_SCHEMAP_AU_PROPS_CORRECT, /* 3088 */
+ XML_SCHEMAP_A_PROPS_CORRECT_3, /* 3089 */
+ XML_SCHEMAP_COS_ALL_LIMITED, /* 3090 */
+ XML_SCHEMATRONV_ASSERT = 4000, /* 4000 */
+ XML_SCHEMATRONV_REPORT,
+ XML_MODULE_OPEN = 4900, /* 4900 */
+ XML_MODULE_CLOSE, /* 4901 */
+ XML_CHECK_FOUND_ELEMENT = 5000,
+ XML_CHECK_FOUND_ATTRIBUTE, /* 5001 */
+ XML_CHECK_FOUND_TEXT, /* 5002 */
+ XML_CHECK_FOUND_CDATA, /* 5003 */
+ XML_CHECK_FOUND_ENTITYREF, /* 5004 */
+ XML_CHECK_FOUND_ENTITY, /* 5005 */
+ XML_CHECK_FOUND_PI, /* 5006 */
+ XML_CHECK_FOUND_COMMENT, /* 5007 */
+ XML_CHECK_FOUND_DOCTYPE, /* 5008 */
+ XML_CHECK_FOUND_FRAGMENT, /* 5009 */
+ XML_CHECK_FOUND_NOTATION, /* 5010 */
+ XML_CHECK_UNKNOWN_NODE, /* 5011 */
+ XML_CHECK_ENTITY_TYPE, /* 5012 */
+ XML_CHECK_NO_PARENT, /* 5013 */
+ XML_CHECK_NO_DOC, /* 5014 */
+ XML_CHECK_NO_NAME, /* 5015 */
+ XML_CHECK_NO_ELEM, /* 5016 */
+ XML_CHECK_WRONG_DOC, /* 5017 */
+ XML_CHECK_NO_PREV, /* 5018 */
+ XML_CHECK_WRONG_PREV, /* 5019 */
+ XML_CHECK_NO_NEXT, /* 5020 */
+ XML_CHECK_WRONG_NEXT, /* 5021 */
+ XML_CHECK_NOT_DTD, /* 5022 */
+ XML_CHECK_NOT_ATTR, /* 5023 */
+ XML_CHECK_NOT_ATTR_DECL, /* 5024 */
+ XML_CHECK_NOT_ELEM_DECL, /* 5025 */
+ XML_CHECK_NOT_ENTITY_DECL, /* 5026 */
+ XML_CHECK_NOT_NS_DECL, /* 5027 */
+ XML_CHECK_NO_HREF, /* 5028 */
+ XML_CHECK_WRONG_PARENT,/* 5029 */
+ XML_CHECK_NS_SCOPE, /* 5030 */
+ XML_CHECK_NS_ANCESTOR, /* 5031 */
+ XML_CHECK_NOT_UTF8, /* 5032 */
+ XML_CHECK_NO_DICT, /* 5033 */
+ XML_CHECK_NOT_NCNAME, /* 5034 */
+ XML_CHECK_OUTSIDE_DICT, /* 5035 */
+ XML_CHECK_WRONG_NAME, /* 5036 */
+ XML_CHECK_NAME_NOT_NULL, /* 5037 */
+ XML_I18N_NO_NAME = 6000,
+ XML_I18N_NO_HANDLER, /* 6001 */
+ XML_I18N_EXCESS_HANDLER, /* 6002 */
+ XML_I18N_CONV_FAILED, /* 6003 */
+ XML_I18N_NO_OUTPUT, /* 6004 */
+ XML_BUF_OVERFLOW = 7000
+} xmlParserErrors;
+
+/**
+ * xmlGenericErrorFunc:
+ * @ctx: a parsing context
+ * @msg: the message
+ * @...: the extra arguments of the varags to format the message
+ *
+ * Signature of the function to use when there is an error and
+ * no parsing or validity context available .
+ */
+typedef void (XMLCDECL *xmlGenericErrorFunc) (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+/**
+ * xmlStructuredErrorFunc:
+ * @userData: user provided data for the error callback
+ * @error: the error being raised.
+ *
+ * Signature of the function to use when there is an error and
+ * the module handles the new error reporting mechanism.
+ */
+typedef void (XMLCALL *xmlStructuredErrorFunc) (void *userData, xmlErrorPtr error);
+
+/*
+ * Use the following function to reset the two global variables
+ * xmlGenericError and xmlGenericErrorContext.
+ */
+XMLPUBFUN void XMLCALL
+ xmlSetGenericErrorFunc (void *ctx,
+ xmlGenericErrorFunc handler);
+XMLPUBFUN void XMLCALL
+ initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler);
+
+XMLPUBFUN void XMLCALL
+ xmlSetStructuredErrorFunc (void *ctx,
+ xmlStructuredErrorFunc handler);
+/*
+ * Default message routines used by SAX and Valid context for error
+ * and warning reporting.
+ */
+XMLPUBFUN void XMLCDECL
+ xmlParserError (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+XMLPUBFUN void XMLCDECL
+ xmlParserWarning (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+XMLPUBFUN void XMLCDECL
+ xmlParserValidityError (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+XMLPUBFUN void XMLCDECL
+ xmlParserValidityWarning (void *ctx,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(2,3);
+XMLPUBFUN void XMLCALL
+ xmlParserPrintFileInfo (xmlParserInputPtr input);
+XMLPUBFUN void XMLCALL
+ xmlParserPrintFileContext (xmlParserInputPtr input);
+
+/*
+ * Extended error information routines
+ */
+XMLPUBFUN xmlErrorPtr XMLCALL
+ xmlGetLastError (void);
+XMLPUBFUN void XMLCALL
+ xmlResetLastError (void);
+XMLPUBFUN xmlErrorPtr XMLCALL
+ xmlCtxtGetLastError (void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlCtxtResetLastError (void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlResetError (xmlErrorPtr err);
+XMLPUBFUN int XMLCALL
+ xmlCopyError (xmlErrorPtr from,
+ xmlErrorPtr to);
+
+#ifdef IN_LIBXML
+/*
+ * Internal callback reporting routine
+ */
+XMLPUBFUN void XMLCALL
+ __xmlRaiseError (xmlStructuredErrorFunc schannel,
+ xmlGenericErrorFunc channel,
+ void *data,
+ void *ctx,
+ void *node,
+ int domain,
+ int code,
+ xmlErrorLevel level,
+ const char *file,
+ int line,
+ const char *str1,
+ const char *str2,
+ const char *str3,
+ int int1,
+ int col,
+ const char *msg,
+ ...) LIBXML_ATTR_FORMAT(16,17);
+XMLPUBFUN void XMLCALL
+ __xmlSimpleError (int domain,
+ int code,
+ xmlNodePtr node,
+ const char *msg,
+ const char *extra);
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_ERROR_H__ */
--- /dev/null
+/*
+ * Summary: macros for marking symbols as exportable/importable.
+ * Description: macros for marking symbols as exportable/importable.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Igor Zlatovic <igor@zlatkovic.com>
+ */
+
+#ifndef __XML_EXPORTS_H__
+#define __XML_EXPORTS_H__
+
+/**
+ * XMLPUBFUN, XMLPUBVAR, XMLCALL
+ *
+ * Macros which declare an exportable function, an exportable variable and
+ * the calling convention used for functions.
+ *
+ * Please use an extra block for every platform/compiler combination when
+ * modifying this, rather than overlong #ifdef lines. This helps
+ * readability as well as the fact that different compilers on the same
+ * platform might need different definitions.
+ */
+
+/**
+ * XMLPUBFUN:
+ *
+ * Macros which declare an exportable function
+ */
+#define XMLPUBFUN
+/**
+ * XMLPUBVAR:
+ *
+ * Macros which declare an exportable variable
+ */
+#define XMLPUBVAR extern
+/**
+ * XMLCALL:
+ *
+ * Macros which declare the called convention for exported functions
+ */
+#define XMLCALL
+/**
+ * XMLCDECL:
+ *
+ * Macro which declares the calling convention for exported functions that
+ * use '...'.
+ */
+#define XMLCDECL
+
+/** DOC_DISABLE */
+
+/* Windows platform with MS compiler */
+#if defined(_WIN32) && defined(_MSC_VER)
+ #undef XMLPUBFUN
+ #undef XMLPUBVAR
+ #undef XMLCALL
+ #undef XMLCDECL
+ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
+ #define XMLPUBFUN __declspec(dllexport)
+ #define XMLPUBVAR __declspec(dllexport)
+ #else
+ #define XMLPUBFUN
+ #if !defined(LIBXML_STATIC)
+ #define XMLPUBVAR __declspec(dllimport) extern
+ #else
+ #define XMLPUBVAR extern
+ #endif
+ #endif
+ #if defined(LIBXML_FASTCALL)
+ #define XMLCALL __fastcall
+ #else
+ #define XMLCALL __cdecl
+ #endif
+ #define XMLCDECL __cdecl
+ #if !defined _REENTRANT
+ #define _REENTRANT
+ #endif
+#endif
+
+/* Windows platform with Borland compiler */
+#if defined(_WIN32) && defined(__BORLANDC__)
+ #undef XMLPUBFUN
+ #undef XMLPUBVAR
+ #undef XMLCALL
+ #undef XMLCDECL
+ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
+ #define XMLPUBFUN __declspec(dllexport)
+ #define XMLPUBVAR __declspec(dllexport) extern
+ #else
+ #define XMLPUBFUN
+ #if !defined(LIBXML_STATIC)
+ #define XMLPUBVAR __declspec(dllimport) extern
+ #else
+ #define XMLPUBVAR extern
+ #endif
+ #endif
+ #define XMLCALL __cdecl
+ #define XMLCDECL __cdecl
+ #if !defined _REENTRANT
+ #define _REENTRANT
+ #endif
+#endif
+
+/* Windows platform with GNU compiler (Mingw) */
+#if defined(_WIN32) && defined(__MINGW32__)
+ #undef XMLPUBFUN
+ #undef XMLPUBVAR
+ #undef XMLCALL
+ #undef XMLCDECL
+ /*
+ * if defined(IN_LIBXML) this raises problems on mingw with msys
+ * _imp__xmlFree listed as missing. Try to workaround the problem
+ * by also making that declaration when compiling client code.
+ */
+ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
+ #define XMLPUBFUN __declspec(dllexport)
+ #define XMLPUBVAR __declspec(dllexport) extern
+ #else
+ #define XMLPUBFUN
+ #if !defined(LIBXML_STATIC)
+ #define XMLPUBVAR __declspec(dllimport) extern
+ #else
+ #define XMLPUBVAR extern
+ #endif
+ #endif
+ #define XMLCALL __cdecl
+ #define XMLCDECL __cdecl
+ #if !defined _REENTRANT
+ #define _REENTRANT
+ #endif
+#endif
+
+/* Cygwin platform, GNU compiler */
+#if defined(_WIN32) && defined(__CYGWIN__)
+ #undef XMLPUBFUN
+ #undef XMLPUBVAR
+ #undef XMLCALL
+ #undef XMLCDECL
+ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
+ #define XMLPUBFUN __declspec(dllexport)
+ #define XMLPUBVAR __declspec(dllexport)
+ #else
+ #define XMLPUBFUN
+ #if !defined(LIBXML_STATIC)
+ #define XMLPUBVAR __declspec(dllimport) extern
+ #else
+ #define XMLPUBVAR
+ #endif
+ #endif
+ #define XMLCALL __cdecl
+ #define XMLCDECL __cdecl
+#endif
+
+/* Compatibility */
+#if !defined(LIBXML_DLL_IMPORT)
+#define LIBXML_DLL_IMPORT XMLPUBVAR
+#endif
+
+#endif /* __XML_EXPORTS_H__ */
+
+
--- /dev/null
+/*
+ * Summary: interface for the memory allocator
+ * Description: provides interfaces for the memory allocator,
+ * including debugging capabilities.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __DEBUG_MEMORY_ALLOC__
+#define __DEBUG_MEMORY_ALLOC__
+
+#include <stdio.h>
+#include <libxml/xmlversion.h>
+
+/**
+ * DEBUG_MEMORY:
+ *
+ * DEBUG_MEMORY replaces the allocator with a collect and debug
+ * shell to the libc allocator.
+ * DEBUG_MEMORY should only be activated when debugging
+ * libxml i.e. if libxml has been configured with --with-debug-mem too.
+ */
+/* #define DEBUG_MEMORY_FREED */
+/* #define DEBUG_MEMORY_LOCATION */
+
+#ifdef DEBUG
+#ifndef DEBUG_MEMORY
+#define DEBUG_MEMORY
+#endif
+#endif
+
+/**
+ * DEBUG_MEMORY_LOCATION:
+ *
+ * DEBUG_MEMORY_LOCATION should be activated only when debugging
+ * libxml i.e. if libxml has been configured with --with-debug-mem too.
+ */
+#ifdef DEBUG_MEMORY_LOCATION
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The XML memory wrapper support 4 basic overloadable functions.
+ */
+/**
+ * xmlFreeFunc:
+ * @mem: an already allocated block of memory
+ *
+ * Signature for a free() implementation.
+ */
+typedef void (XMLCALL *xmlFreeFunc)(void *mem);
+/**
+ * xmlMallocFunc:
+ * @size: the size requested in bytes
+ *
+ * Signature for a malloc() implementation.
+ *
+ * Returns a pointer to the newly allocated block or NULL in case of error.
+ */
+typedef void *(LIBXML_ATTR_ALLOC_SIZE(1) XMLCALL *xmlMallocFunc)(size_t size);
+
+/**
+ * xmlReallocFunc:
+ * @mem: an already allocated block of memory
+ * @size: the new size requested in bytes
+ *
+ * Signature for a realloc() implementation.
+ *
+ * Returns a pointer to the newly reallocated block or NULL in case of error.
+ */
+typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size);
+
+/**
+ * xmlStrdupFunc:
+ * @str: a zero terminated string
+ *
+ * Signature for an strdup() implementation.
+ *
+ * Returns the copy of the string or NULL in case of error.
+ */
+typedef char *(XMLCALL *xmlStrdupFunc)(const char *str);
+
+/*
+ * The 4 interfaces used for all memory handling within libxml.
+LIBXML_DLL_IMPORT xmlFreeFunc xmlFree;
+LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc;
+LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic;
+LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc;
+LIBXML_DLL_IMPORT xmlStrdupFunc xmlMemStrdup;
+ */
+
+/*
+ * The way to overload the existing functions.
+ * The xmlGc function have an extra entry for atomic block
+ * allocations useful for garbage collected memory allocators
+ */
+XMLPUBFUN int XMLCALL
+ xmlMemSetup (xmlFreeFunc freeFunc,
+ xmlMallocFunc mallocFunc,
+ xmlReallocFunc reallocFunc,
+ xmlStrdupFunc strdupFunc);
+XMLPUBFUN int XMLCALL
+ xmlMemGet (xmlFreeFunc *freeFunc,
+ xmlMallocFunc *mallocFunc,
+ xmlReallocFunc *reallocFunc,
+ xmlStrdupFunc *strdupFunc);
+XMLPUBFUN int XMLCALL
+ xmlGcMemSetup (xmlFreeFunc freeFunc,
+ xmlMallocFunc mallocFunc,
+ xmlMallocFunc mallocAtomicFunc,
+ xmlReallocFunc reallocFunc,
+ xmlStrdupFunc strdupFunc);
+XMLPUBFUN int XMLCALL
+ xmlGcMemGet (xmlFreeFunc *freeFunc,
+ xmlMallocFunc *mallocFunc,
+ xmlMallocFunc *mallocAtomicFunc,
+ xmlReallocFunc *reallocFunc,
+ xmlStrdupFunc *strdupFunc);
+
+/*
+ * Initialization of the memory layer.
+ */
+XMLPUBFUN int XMLCALL
+ xmlInitMemory (void);
+
+/*
+ * Cleanup of the memory layer.
+ */
+XMLPUBFUN void XMLCALL
+ xmlCleanupMemory (void);
+/*
+ * These are specific to the XML debug memory wrapper.
+ */
+XMLPUBFUN int XMLCALL
+ xmlMemUsed (void);
+XMLPUBFUN int XMLCALL
+ xmlMemBlocks (void);
+XMLPUBFUN void XMLCALL
+ xmlMemDisplay (FILE *fp);
+XMLPUBFUN void XMLCALL
+ xmlMemDisplayLast(FILE *fp, long nbBytes);
+XMLPUBFUN void XMLCALL
+ xmlMemShow (FILE *fp, int nr);
+XMLPUBFUN void XMLCALL
+ xmlMemoryDump (void);
+XMLPUBFUN void * XMLCALL
+ xmlMemMalloc (size_t size) LIBXML_ATTR_ALLOC_SIZE(1);
+XMLPUBFUN void * XMLCALL
+ xmlMemRealloc (void *ptr,size_t size);
+XMLPUBFUN void XMLCALL
+ xmlMemFree (void *ptr);
+XMLPUBFUN char * XMLCALL
+ xmlMemoryStrdup (const char *str);
+XMLPUBFUN void * XMLCALL
+ xmlMallocLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
+XMLPUBFUN void * XMLCALL
+ xmlReallocLoc (void *ptr, size_t size, const char *file, int line);
+XMLPUBFUN void * XMLCALL
+ xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
+XMLPUBFUN char * XMLCALL
+ xmlMemStrdupLoc (const char *str, const char *file, int line);
+
+
+#ifdef DEBUG_MEMORY_LOCATION
+/**
+ * xmlMalloc:
+ * @size: number of bytes to allocate
+ *
+ * Wrapper for the malloc() function used in the XML library.
+ *
+ * Returns the pointer to the allocated area or NULL in case of error.
+ */
+#define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__)
+/**
+ * xmlMallocAtomic:
+ * @size: number of bytes to allocate
+ *
+ * Wrapper for the malloc() function used in the XML library for allocation
+ * of block not containing pointers to other areas.
+ *
+ * Returns the pointer to the allocated area or NULL in case of error.
+ */
+#define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__)
+/**
+ * xmlRealloc:
+ * @ptr: pointer to the existing allocated area
+ * @size: number of bytes to allocate
+ *
+ * Wrapper for the realloc() function used in the XML library.
+ *
+ * Returns the pointer to the allocated area or NULL in case of error.
+ */
+#define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__)
+/**
+ * xmlMemStrdup:
+ * @str: pointer to the existing string
+ *
+ * Wrapper for the strdup() function, xmlStrdup() is usually preferred.
+ *
+ * Returns the pointer to the allocated area or NULL in case of error.
+ */
+#define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__)
+
+#endif /* DEBUG_MEMORY_LOCATION */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifndef __XML_GLOBALS_H
+#ifndef __XML_THREADS_H__
+#include <libxml/threads.h>
+#include <libxml/globals.h>
+#endif
+#endif
+
+#endif /* __DEBUG_MEMORY_ALLOC__ */
+
--- /dev/null
+/*
+ * Summary: dynamic module loading
+ * Description: basic API for dynamic module loading, used by
+ * libexslt added in 2.6.17
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Joel W. Reed
+ */
+
+#ifndef __XML_MODULE_H__
+#define __XML_MODULE_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_MODULES_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlModulePtr:
+ *
+ * A handle to a dynamically loaded module
+ */
+typedef struct _xmlModule xmlModule;
+typedef xmlModule *xmlModulePtr;
+
+/**
+ * xmlModuleOption:
+ *
+ * enumeration of options that can be passed down to xmlModuleOpen()
+ */
+typedef enum {
+ XML_MODULE_LAZY = 1, /* lazy binding */
+ XML_MODULE_LOCAL= 2 /* local binding */
+} xmlModuleOption;
+
+XMLPUBFUN xmlModulePtr XMLCALL xmlModuleOpen (const char *filename,
+ int options);
+
+XMLPUBFUN int XMLCALL xmlModuleSymbol (xmlModulePtr module,
+ const char* name,
+ void **result);
+
+XMLPUBFUN int XMLCALL xmlModuleClose (xmlModulePtr module);
+
+XMLPUBFUN int XMLCALL xmlModuleFree (xmlModulePtr module);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_MODULES_ENABLED */
+
+#endif /*__XML_MODULE_H__ */
--- /dev/null
+/*
+ * Summary: the XMLReader implementation
+ * Description: API of the XML streaming API based on C# interfaces.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XMLREADER_H__
+#define __XML_XMLREADER_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/xmlIO.h>
+#ifdef LIBXML_SCHEMAS_ENABLED
+#include <libxml/relaxng.h>
+#include <libxml/xmlschemas.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlParserSeverities:
+ *
+ * How severe an error callback is when the per-reader error callback API
+ * is used.
+ */
+typedef enum {
+ XML_PARSER_SEVERITY_VALIDITY_WARNING = 1,
+ XML_PARSER_SEVERITY_VALIDITY_ERROR = 2,
+ XML_PARSER_SEVERITY_WARNING = 3,
+ XML_PARSER_SEVERITY_ERROR = 4
+} xmlParserSeverities;
+
+#ifdef LIBXML_READER_ENABLED
+
+/**
+ * xmlTextReaderMode:
+ *
+ * Internal state values for the reader.
+ */
+typedef enum {
+ XML_TEXTREADER_MODE_INITIAL = 0,
+ XML_TEXTREADER_MODE_INTERACTIVE = 1,
+ XML_TEXTREADER_MODE_ERROR = 2,
+ XML_TEXTREADER_MODE_EOF =3,
+ XML_TEXTREADER_MODE_CLOSED = 4,
+ XML_TEXTREADER_MODE_READING = 5
+} xmlTextReaderMode;
+
+/**
+ * xmlParserProperties:
+ *
+ * Some common options to use with xmlTextReaderSetParserProp, but it
+ * is better to use xmlParserOption and the xmlReaderNewxxx and
+ * xmlReaderForxxx APIs now.
+ */
+typedef enum {
+ XML_PARSER_LOADDTD = 1,
+ XML_PARSER_DEFAULTATTRS = 2,
+ XML_PARSER_VALIDATE = 3,
+ XML_PARSER_SUBST_ENTITIES = 4
+} xmlParserProperties;
+
+/**
+ * xmlReaderTypes:
+ *
+ * Predefined constants for the different types of nodes.
+ */
+typedef enum {
+ XML_READER_TYPE_NONE = 0,
+ XML_READER_TYPE_ELEMENT = 1,
+ XML_READER_TYPE_ATTRIBUTE = 2,
+ XML_READER_TYPE_TEXT = 3,
+ XML_READER_TYPE_CDATA = 4,
+ XML_READER_TYPE_ENTITY_REFERENCE = 5,
+ XML_READER_TYPE_ENTITY = 6,
+ XML_READER_TYPE_PROCESSING_INSTRUCTION = 7,
+ XML_READER_TYPE_COMMENT = 8,
+ XML_READER_TYPE_DOCUMENT = 9,
+ XML_READER_TYPE_DOCUMENT_TYPE = 10,
+ XML_READER_TYPE_DOCUMENT_FRAGMENT = 11,
+ XML_READER_TYPE_NOTATION = 12,
+ XML_READER_TYPE_WHITESPACE = 13,
+ XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14,
+ XML_READER_TYPE_END_ELEMENT = 15,
+ XML_READER_TYPE_END_ENTITY = 16,
+ XML_READER_TYPE_XML_DECLARATION = 17
+} xmlReaderTypes;
+
+/**
+ * xmlTextReader:
+ *
+ * Structure for an xmlReader context.
+ */
+typedef struct _xmlTextReader xmlTextReader;
+
+/**
+ * xmlTextReaderPtr:
+ *
+ * Pointer to an xmlReader context.
+ */
+typedef xmlTextReader *xmlTextReaderPtr;
+
+/*
+ * Constructors & Destructor
+ */
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlNewTextReader (xmlParserInputBufferPtr input,
+ const char *URI);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlNewTextReaderFilename(const char *URI);
+
+XMLPUBFUN void XMLCALL
+ xmlFreeTextReader (xmlTextReaderPtr reader);
+
+XMLPUBFUN int XMLCALL
+ xmlTextReaderSetup(xmlTextReaderPtr reader,
+ xmlParserInputBufferPtr input, const char *URL,
+ const char *encoding, int options);
+
+/*
+ * Iterators
+ */
+XMLPUBFUN int XMLCALL
+ xmlTextReaderRead (xmlTextReaderPtr reader);
+
+#ifdef LIBXML_WRITER_ENABLED
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderReadInnerXml(xmlTextReaderPtr reader);
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderReadOuterXml(xmlTextReaderPtr reader);
+#endif
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderReadString (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader);
+
+/*
+ * Attributes of the node
+ */
+XMLPUBFUN int XMLCALL
+ xmlTextReaderAttributeCount(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderDepth (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderHasAttributes(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderHasValue(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderIsDefault (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderNodeType (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderQuoteChar (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderReadState (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader);
+
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstBaseUri (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstLocalName (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstName (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstPrefix (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstXmlLang (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstString (xmlTextReaderPtr reader,
+ const xmlChar *str);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstValue (xmlTextReaderPtr reader);
+
+/*
+ * use the Const version of the routine for
+ * better performance and simpler code
+ */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderBaseUri (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderLocalName (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderName (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderNamespaceUri(xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderPrefix (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderXmlLang (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderValue (xmlTextReaderPtr reader);
+
+/*
+ * Methods of the XmlTextReader
+ */
+XMLPUBFUN int XMLCALL
+ xmlTextReaderClose (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader,
+ int no);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderGetAttribute (xmlTextReaderPtr reader,
+ const xmlChar *name);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader,
+ const xmlChar *localName,
+ const xmlChar *namespaceURI);
+XMLPUBFUN xmlParserInputBufferPtr XMLCALL
+ xmlTextReaderGetRemainder (xmlTextReaderPtr reader);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderLookupNamespace(xmlTextReaderPtr reader,
+ const xmlChar *prefix);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader,
+ int no);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader,
+ const xmlChar *name);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,
+ const xmlChar *localName,
+ const xmlChar *namespaceURI);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderMoveToElement (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderNormalization (xmlTextReaderPtr reader);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstEncoding (xmlTextReaderPtr reader);
+
+/*
+ * Extensions
+ */
+XMLPUBFUN int XMLCALL
+ xmlTextReaderSetParserProp (xmlTextReaderPtr reader,
+ int prop,
+ int value);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderGetParserProp (xmlTextReaderPtr reader,
+ int prop);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlTextReaderCurrentNode (xmlTextReaderPtr reader);
+
+XMLPUBFUN int XMLCALL
+ xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader);
+
+XMLPUBFUN int XMLCALL
+ xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader);
+
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlTextReaderPreserve (xmlTextReaderPtr reader);
+#ifdef LIBXML_PATTERN_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlTextReaderPreservePattern(xmlTextReaderPtr reader,
+ const xmlChar *pattern,
+ const xmlChar **namespaces);
+#endif /* LIBXML_PATTERN_ENABLED */
+XMLPUBFUN xmlDocPtr XMLCALL
+ xmlTextReaderCurrentDoc (xmlTextReaderPtr reader);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlTextReaderExpand (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderNext (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderNextSibling (xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderIsValid (xmlTextReaderPtr reader);
+#ifdef LIBXML_SCHEMAS_ENABLED
+XMLPUBFUN int XMLCALL
+ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader,
+ const char *rng);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader,
+ xmlRelaxNGValidCtxtPtr ctxt,
+ int options);
+
+XMLPUBFUN int XMLCALL
+ xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader,
+ xmlRelaxNGPtr schema);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderSchemaValidate (xmlTextReaderPtr reader,
+ const char *xsd);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader,
+ xmlSchemaValidCtxtPtr ctxt,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderSetSchema (xmlTextReaderPtr reader,
+ xmlSchemaPtr schema);
+#endif
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderStandalone (xmlTextReaderPtr reader);
+
+
+/*
+ * Index lookup
+ */
+XMLPUBFUN long XMLCALL
+ xmlTextReaderByteConsumed (xmlTextReaderPtr reader);
+
+/*
+ * New more complete APIs for simpler creation and reuse of readers
+ */
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderWalker (xmlDocPtr doc);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderForDoc (const xmlChar * cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderForFile (const char *filename,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderForMemory (const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderForFd (int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlTextReaderPtr XMLCALL
+ xmlReaderForIO (xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+
+XMLPUBFUN int XMLCALL
+ xmlReaderNewWalker (xmlTextReaderPtr reader,
+ xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlReaderNewDoc (xmlTextReaderPtr reader,
+ const xmlChar * cur,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlReaderNewFile (xmlTextReaderPtr reader,
+ const char *filename,
+ const char *encoding,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlReaderNewMemory (xmlTextReaderPtr reader,
+ const char *buffer,
+ int size,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlReaderNewFd (xmlTextReaderPtr reader,
+ int fd,
+ const char *URL,
+ const char *encoding,
+ int options);
+XMLPUBFUN int XMLCALL
+ xmlReaderNewIO (xmlTextReaderPtr reader,
+ xmlInputReadCallback ioread,
+ xmlInputCloseCallback ioclose,
+ void *ioctx,
+ const char *URL,
+ const char *encoding,
+ int options);
+/*
+ * Error handling extensions
+ */
+typedef void * xmlTextReaderLocatorPtr;
+
+/**
+ * xmlTextReaderErrorFunc:
+ * @arg: the user argument
+ * @msg: the message
+ * @severity: the severity of the error
+ * @locator: a locator indicating where the error occured
+ *
+ * Signature of an error callback from a reader parser
+ */
+typedef void (XMLCALL *xmlTextReaderErrorFunc)(void *arg,
+ const char *msg,
+ xmlParserSeverities severity,
+ xmlTextReaderLocatorPtr locator);
+XMLPUBFUN int XMLCALL
+ xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator);
+XMLPUBFUN void XMLCALL
+ xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,
+ xmlTextReaderErrorFunc f,
+ void *arg);
+XMLPUBFUN void XMLCALL
+ xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,
+ xmlStructuredErrorFunc f,
+ void *arg);
+XMLPUBFUN void XMLCALL
+ xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader,
+ xmlTextReaderErrorFunc *f,
+ void **arg);
+
+#endif /* LIBXML_READER_ENABLED */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_XMLREADER_H__ */
+
--- /dev/null
+/*
+ * Summary: regular expressions handling
+ * Description: basic API for libxml regular expressions handling used
+ * for XML Schemas and validation.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_REGEXP_H__
+#define __XML_REGEXP_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_REGEXP_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlRegexpPtr:
+ *
+ * A libxml regular expression, they can actually be far more complex
+ * thank the POSIX regex expressions.
+ */
+typedef struct _xmlRegexp xmlRegexp;
+typedef xmlRegexp *xmlRegexpPtr;
+
+/**
+ * xmlRegExecCtxtPtr:
+ *
+ * A libxml progressive regular expression evaluation context
+ */
+typedef struct _xmlRegExecCtxt xmlRegExecCtxt;
+typedef xmlRegExecCtxt *xmlRegExecCtxtPtr;
+
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/tree.h>
+#include <libxml/dict.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The POSIX like API
+ */
+XMLPUBFUN xmlRegexpPtr XMLCALL
+ xmlRegexpCompile (const xmlChar *regexp);
+XMLPUBFUN void XMLCALL xmlRegFreeRegexp(xmlRegexpPtr regexp);
+XMLPUBFUN int XMLCALL
+ xmlRegexpExec (xmlRegexpPtr comp,
+ const xmlChar *value);
+XMLPUBFUN void XMLCALL
+ xmlRegexpPrint (FILE *output,
+ xmlRegexpPtr regexp);
+XMLPUBFUN int XMLCALL
+ xmlRegexpIsDeterminist(xmlRegexpPtr comp);
+
+/**
+ * xmlRegExecCallbacks:
+ * @exec: the regular expression context
+ * @token: the current token string
+ * @transdata: transition data
+ * @inputdata: input data
+ *
+ * Callback function when doing a transition in the automata
+ */
+typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec,
+ const xmlChar *token,
+ void *transdata,
+ void *inputdata);
+
+/*
+ * The progressive API
+ */
+XMLPUBFUN xmlRegExecCtxtPtr XMLCALL
+ xmlRegNewExecCtxt (xmlRegexpPtr comp,
+ xmlRegExecCallbacks callback,
+ void *data);
+XMLPUBFUN void XMLCALL
+ xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec);
+XMLPUBFUN int XMLCALL
+ xmlRegExecPushString(xmlRegExecCtxtPtr exec,
+ const xmlChar *value,
+ void *data);
+XMLPUBFUN int XMLCALL
+ xmlRegExecPushString2(xmlRegExecCtxtPtr exec,
+ const xmlChar *value,
+ const xmlChar *value2,
+ void *data);
+
+XMLPUBFUN int XMLCALL
+ xmlRegExecNextValues(xmlRegExecCtxtPtr exec,
+ int *nbval,
+ int *nbneg,
+ xmlChar **values,
+ int *terminal);
+XMLPUBFUN int XMLCALL
+ xmlRegExecErrInfo (xmlRegExecCtxtPtr exec,
+ const xmlChar **string,
+ int *nbval,
+ int *nbneg,
+ xmlChar **values,
+ int *terminal);
+#ifdef LIBXML_EXPR_ENABLED
+/*
+ * Formal regular expression handling
+ * Its goal is to do some formal work on content models
+ */
+
+/* expressions are used within a context */
+typedef struct _xmlExpCtxt xmlExpCtxt;
+typedef xmlExpCtxt *xmlExpCtxtPtr;
+
+XMLPUBFUN void XMLCALL
+ xmlExpFreeCtxt (xmlExpCtxtPtr ctxt);
+XMLPUBFUN xmlExpCtxtPtr XMLCALL
+ xmlExpNewCtxt (int maxNodes,
+ xmlDictPtr dict);
+
+XMLPUBFUN int XMLCALL
+ xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt);
+
+/* Expressions are trees but the tree is opaque */
+typedef struct _xmlExpNode xmlExpNode;
+typedef xmlExpNode *xmlExpNodePtr;
+
+typedef enum {
+ XML_EXP_EMPTY = 0,
+ XML_EXP_FORBID = 1,
+ XML_EXP_ATOM = 2,
+ XML_EXP_SEQ = 3,
+ XML_EXP_OR = 4,
+ XML_EXP_COUNT = 5
+} xmlExpNodeType;
+
+/*
+ * 2 core expressions shared by all for the empty language set
+ * and for the set with just the empty token
+ */
+XMLPUBVAR xmlExpNodePtr forbiddenExp;
+XMLPUBVAR xmlExpNodePtr emptyExp;
+
+/*
+ * Expressions are reference counted internally
+ */
+XMLPUBFUN void XMLCALL
+ xmlExpFree (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr);
+XMLPUBFUN void XMLCALL
+ xmlExpRef (xmlExpNodePtr expr);
+
+/*
+ * constructors can be either manual or from a string
+ */
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpParse (xmlExpCtxtPtr ctxt,
+ const char *expr);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpNewAtom (xmlExpCtxtPtr ctxt,
+ const xmlChar *name,
+ int len);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpNewOr (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr left,
+ xmlExpNodePtr right);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpNewSeq (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr left,
+ xmlExpNodePtr right);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpNewRange (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr subset,
+ int min,
+ int max);
+/*
+ * The really interesting APIs
+ */
+XMLPUBFUN int XMLCALL
+ xmlExpIsNillable(xmlExpNodePtr expr);
+XMLPUBFUN int XMLCALL
+ xmlExpMaxToken (xmlExpNodePtr expr);
+XMLPUBFUN int XMLCALL
+ xmlExpGetLanguage(xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr,
+ const xmlChar**langList,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlExpGetStart (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr,
+ const xmlChar**tokList,
+ int len);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpStringDerive(xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr,
+ const xmlChar *str,
+ int len);
+XMLPUBFUN xmlExpNodePtr XMLCALL
+ xmlExpExpDerive (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr,
+ xmlExpNodePtr sub);
+XMLPUBFUN int XMLCALL
+ xmlExpSubsume (xmlExpCtxtPtr ctxt,
+ xmlExpNodePtr expr,
+ xmlExpNodePtr sub);
+XMLPUBFUN void XMLCALL
+ xmlExpDump (xmlBufferPtr buf,
+ xmlExpNodePtr expr);
+#endif /* LIBXML_EXPR_ENABLED */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_REGEXP_ENABLED */
+
+#endif /*__XML_REGEXP_H__ */
--- /dev/null
+/*
+ * Summary: the XML document serializer
+ * Description: API to save document or subtree of document
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XMLSAVE_H__
+#define __XML_XMLSAVE_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/tree.h>
+#include <libxml/encoding.h>
+#include <libxml/xmlIO.h>
+
+#ifdef LIBXML_OUTPUT_ENABLED
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlSaveOption:
+ *
+ * This is the set of XML save options that can be passed down
+ * to the xmlSaveToFd() and similar calls.
+ */
+typedef enum {
+ XML_SAVE_FORMAT = 1<<0, /* format save output */
+ XML_SAVE_NO_DECL = 1<<1, /* drop the xml declaration */
+ XML_SAVE_NO_EMPTY = 1<<2, /* no empty tags */
+ XML_SAVE_NO_XHTML = 1<<3, /* disable XHTML1 specific rules */
+ XML_SAVE_XHTML = 1<<4, /* force XHTML1 specific rules */
+ XML_SAVE_AS_XML = 1<<5, /* force XML serialization on HTML doc */
+ XML_SAVE_AS_HTML = 1<<6, /* force HTML serialization on XML doc */
+ XML_SAVE_WSNONSIG = 1<<7 /* format with non-significant whitespace */
+} xmlSaveOption;
+
+
+typedef struct _xmlSaveCtxt xmlSaveCtxt;
+typedef xmlSaveCtxt *xmlSaveCtxtPtr;
+
+XMLPUBFUN xmlSaveCtxtPtr XMLCALL
+ xmlSaveToFd (int fd,
+ const char *encoding,
+ int options);
+XMLPUBFUN xmlSaveCtxtPtr XMLCALL
+ xmlSaveToFilename (const char *filename,
+ const char *encoding,
+ int options);
+
+XMLPUBFUN xmlSaveCtxtPtr XMLCALL
+ xmlSaveToBuffer (xmlBufferPtr buffer,
+ const char *encoding,
+ int options);
+
+XMLPUBFUN xmlSaveCtxtPtr XMLCALL
+ xmlSaveToIO (xmlOutputWriteCallback iowrite,
+ xmlOutputCloseCallback ioclose,
+ void *ioctx,
+ const char *encoding,
+ int options);
+
+XMLPUBFUN long XMLCALL
+ xmlSaveDoc (xmlSaveCtxtPtr ctxt,
+ xmlDocPtr doc);
+XMLPUBFUN long XMLCALL
+ xmlSaveTree (xmlSaveCtxtPtr ctxt,
+ xmlNodePtr node);
+
+XMLPUBFUN int XMLCALL
+ xmlSaveFlush (xmlSaveCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlSaveClose (xmlSaveCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlSaveSetEscape (xmlSaveCtxtPtr ctxt,
+ xmlCharEncodingOutputFunc escape);
+XMLPUBFUN int XMLCALL
+ xmlSaveSetAttrEscape (xmlSaveCtxtPtr ctxt,
+ xmlCharEncodingOutputFunc escape);
+#ifdef __cplusplus
+}
+#endif
+#endif /* LIBXML_OUTPUT_ENABLED */
+#endif /* __XML_XMLSAVE_H__ */
+
+
--- /dev/null
+/*
+ * Summary: incomplete XML Schemas structure implementation
+ * Description: interface to the XML Schemas handling and schema validity
+ * checking, it is incomplete right now.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SCHEMA_H__
+#define __XML_SCHEMA_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+
+#include <libxml/tree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * This error codes are obsolete; not used any more.
+ */
+typedef enum {
+ XML_SCHEMAS_ERR_OK = 0,
+ XML_SCHEMAS_ERR_NOROOT = 1,
+ XML_SCHEMAS_ERR_UNDECLAREDELEM,
+ XML_SCHEMAS_ERR_NOTTOPLEVEL,
+ XML_SCHEMAS_ERR_MISSING,
+ XML_SCHEMAS_ERR_WRONGELEM,
+ XML_SCHEMAS_ERR_NOTYPE,
+ XML_SCHEMAS_ERR_NOROLLBACK,
+ XML_SCHEMAS_ERR_ISABSTRACT,
+ XML_SCHEMAS_ERR_NOTEMPTY,
+ XML_SCHEMAS_ERR_ELEMCONT,
+ XML_SCHEMAS_ERR_HAVEDEFAULT,
+ XML_SCHEMAS_ERR_NOTNILLABLE,
+ XML_SCHEMAS_ERR_EXTRACONTENT,
+ XML_SCHEMAS_ERR_INVALIDATTR,
+ XML_SCHEMAS_ERR_INVALIDELEM,
+ XML_SCHEMAS_ERR_NOTDETERMINIST,
+ XML_SCHEMAS_ERR_CONSTRUCT,
+ XML_SCHEMAS_ERR_INTERNAL,
+ XML_SCHEMAS_ERR_NOTSIMPLE,
+ XML_SCHEMAS_ERR_ATTRUNKNOWN,
+ XML_SCHEMAS_ERR_ATTRINVALID,
+ XML_SCHEMAS_ERR_VALUE,
+ XML_SCHEMAS_ERR_FACET,
+ XML_SCHEMAS_ERR_,
+ XML_SCHEMAS_ERR_XXX
+} xmlSchemaValidError;
+
+/*
+* ATTENTION: Change xmlSchemaSetValidOptions's check
+* for invalid values, if adding to the validation
+* options below.
+*/
+/**
+ * xmlSchemaValidOption:
+ *
+ * This is the set of XML Schema validation options.
+ */
+typedef enum {
+ XML_SCHEMA_VAL_VC_I_CREATE = 1<<0
+ /* Default/fixed: create an attribute node
+ * or an element's text node on the instance.
+ */
+} xmlSchemaValidOption;
+
+/*
+ XML_SCHEMA_VAL_XSI_ASSEMBLE = 1<<1,
+ * assemble schemata using
+ * xsi:schemaLocation and
+ * xsi:noNamespaceSchemaLocation
+*/
+
+/**
+ * The schemas related types are kept internal
+ */
+typedef struct _xmlSchema xmlSchema;
+typedef xmlSchema *xmlSchemaPtr;
+
+/**
+ * xmlSchemaValidityErrorFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of an error callback from an XSD validation
+ */
+typedef void (XMLCDECL *xmlSchemaValidityErrorFunc)
+ (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+
+/**
+ * xmlSchemaValidityWarningFunc:
+ * @ctx: the validation context
+ * @msg: the message
+ * @...: extra arguments
+ *
+ * Signature of a warning callback from an XSD validation
+ */
+typedef void (XMLCDECL *xmlSchemaValidityWarningFunc)
+ (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
+
+/**
+ * A schemas validation context
+ */
+typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt;
+typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr;
+
+typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt;
+typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr;
+
+/**
+ * xmlSchemaValidityLocatorFunc:
+ * @ctx: user provided context
+ * @file: returned file information
+ * @line: returned line information
+ *
+ * A schemas validation locator, a callback called by the validator.
+ * This is used when file or node informations are not available
+ * to find out what file and line number are affected
+ *
+ * Returns: 0 in case of success and -1 in case of error
+ */
+
+typedef int (XMLCDECL *xmlSchemaValidityLocatorFunc) (void *ctx,
+ const char **file, unsigned long *line);
+
+/*
+ * Interfaces for parsing.
+ */
+XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
+ xmlSchemaNewParserCtxt (const char *URL);
+XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
+ xmlSchemaNewMemParserCtxt (const char *buffer,
+ int size);
+XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL
+ xmlSchemaNewDocParserCtxt (xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlSchemaFreeParserCtxt (xmlSchemaParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt,
+ xmlSchemaValidityErrorFunc err,
+ xmlSchemaValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
+ xmlStructuredErrorFunc serror,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
+ xmlSchemaValidityErrorFunc * err,
+ xmlSchemaValidityWarningFunc * warn,
+ void **ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt);
+
+XMLPUBFUN xmlSchemaPtr XMLCALL
+ xmlSchemaParse (xmlSchemaParserCtxtPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlSchemaFree (xmlSchemaPtr schema);
+#ifdef LIBXML_OUTPUT_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlSchemaDump (FILE *output,
+ xmlSchemaPtr schema);
+#endif /* LIBXML_OUTPUT_ENABLED */
+/*
+ * Interfaces for validating
+ */
+XMLPUBFUN void XMLCALL
+ xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt,
+ xmlSchemaValidityErrorFunc err,
+ xmlSchemaValidityWarningFunc warn,
+ void *ctx);
+XMLPUBFUN void XMLCALL
+ xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
+ xmlStructuredErrorFunc serror,
+ void *ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt,
+ xmlSchemaValidityErrorFunc *err,
+ xmlSchemaValidityWarningFunc *warn,
+ void **ctx);
+XMLPUBFUN int XMLCALL
+ xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt,
+ int options);
+XMLPUBFUN void XMLCALL
+ xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt,
+ const char *filename);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt);
+
+XMLPUBFUN xmlSchemaValidCtxtPtr XMLCALL
+ xmlSchemaNewValidCtxt (xmlSchemaPtr schema);
+XMLPUBFUN void XMLCALL
+ xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt,
+ xmlDocPtr instance);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt,
+ xmlNodePtr elem);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt,
+ xmlParserInputBufferPtr input,
+ xmlCharEncoding enc,
+ xmlSAXHandlerPtr sax,
+ void *user_data);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt,
+ const char * filename,
+ int options);
+
+XMLPUBFUN xmlParserCtxtPtr XMLCALL
+ xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt);
+
+/*
+ * Interface to insert Schemas SAX validation in a SAX stream
+ */
+typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct;
+typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr;
+
+XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL
+ xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt,
+ xmlSAXHandlerPtr *sax,
+ void **user_data);
+XMLPUBFUN int XMLCALL
+ xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug);
+
+
+XMLPUBFUN void XMLCALL
+ xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt,
+ xmlSchemaValidityLocatorFunc f,
+ void *ctxt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_SCHEMAS_ENABLED */
+#endif /* __XML_SCHEMA_H__ */
--- /dev/null
+/*
+ * Summary: implementation of XML Schema Datatypes
+ * Description: module providing the XML Schema Datatypes implementation
+ * both definition and validity checking
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+
+#ifndef __XML_SCHEMA_TYPES_H__
+#define __XML_SCHEMA_TYPES_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+
+#include <libxml/schemasInternals.h>
+#include <libxml/xmlschemas.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ XML_SCHEMA_WHITESPACE_UNKNOWN = 0,
+ XML_SCHEMA_WHITESPACE_PRESERVE = 1,
+ XML_SCHEMA_WHITESPACE_REPLACE = 2,
+ XML_SCHEMA_WHITESPACE_COLLAPSE = 3
+} xmlSchemaWhitespaceValueType;
+
+XMLPUBFUN void XMLCALL
+ xmlSchemaInitTypes (void);
+XMLPUBFUN void XMLCALL
+ xmlSchemaCleanupTypes (void);
+XMLPUBFUN xmlSchemaTypePtr XMLCALL
+ xmlSchemaGetPredefinedType (const xmlChar *name,
+ const xmlChar *ns);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type,
+ const xmlChar *value,
+ xmlSchemaValPtr *val);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValPredefTypeNode (xmlSchemaTypePtr type,
+ const xmlChar *value,
+ xmlSchemaValPtr *val,
+ xmlNodePtr node);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateFacet (xmlSchemaTypePtr base,
+ xmlSchemaFacetPtr facet,
+ const xmlChar *value,
+ xmlSchemaValPtr val);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet,
+ xmlSchemaWhitespaceValueType fws,
+ xmlSchemaValType valType,
+ const xmlChar *value,
+ xmlSchemaValPtr val,
+ xmlSchemaWhitespaceValueType ws);
+XMLPUBFUN void XMLCALL
+ xmlSchemaFreeValue (xmlSchemaValPtr val);
+XMLPUBFUN xmlSchemaFacetPtr XMLCALL
+ xmlSchemaNewFacet (void);
+XMLPUBFUN int XMLCALL
+ xmlSchemaCheckFacet (xmlSchemaFacetPtr facet,
+ xmlSchemaTypePtr typeDecl,
+ xmlSchemaParserCtxtPtr ctxt,
+ const xmlChar *name);
+XMLPUBFUN void XMLCALL
+ xmlSchemaFreeFacet (xmlSchemaFacetPtr facet);
+XMLPUBFUN int XMLCALL
+ xmlSchemaCompareValues (xmlSchemaValPtr x,
+ xmlSchemaValPtr y);
+XMLPUBFUN xmlSchemaTypePtr XMLCALL
+ xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet,
+ const xmlChar *value,
+ unsigned long actualLen,
+ unsigned long *expectedLen);
+XMLPUBFUN xmlSchemaTypePtr XMLCALL
+ xmlSchemaGetBuiltInType (xmlSchemaValType type);
+XMLPUBFUN int XMLCALL
+ xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type,
+ int facetType);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlSchemaCollapseString (const xmlChar *value);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlSchemaWhiteSpaceReplace (const xmlChar *value);
+XMLPUBFUN unsigned long XMLCALL
+ xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type,
+ xmlSchemaFacetPtr facet,
+ const xmlChar *value,
+ xmlSchemaValPtr val,
+ unsigned long *length);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
+ xmlSchemaValType valType,
+ const xmlChar *value,
+ xmlSchemaValPtr val,
+ unsigned long *length,
+ xmlSchemaWhitespaceValueType ws);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type,
+ const xmlChar *value,
+ xmlSchemaValPtr *val,
+ xmlNodePtr node);
+XMLPUBFUN int XMLCALL
+ xmlSchemaGetCanonValue (xmlSchemaValPtr val,
+ const xmlChar **retValue);
+XMLPUBFUN int XMLCALL
+ xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val,
+ const xmlChar **retValue,
+ xmlSchemaWhitespaceValueType ws);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValueAppend (xmlSchemaValPtr prev,
+ xmlSchemaValPtr cur);
+XMLPUBFUN xmlSchemaValPtr XMLCALL
+ xmlSchemaValueGetNext (xmlSchemaValPtr cur);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlSchemaValueGetAsString (xmlSchemaValPtr val);
+XMLPUBFUN int XMLCALL
+ xmlSchemaValueGetAsBoolean (xmlSchemaValPtr val);
+XMLPUBFUN xmlSchemaValPtr XMLCALL
+ xmlSchemaNewStringValue (xmlSchemaValType type,
+ const xmlChar *value);
+XMLPUBFUN xmlSchemaValPtr XMLCALL
+ xmlSchemaNewNOTATIONValue (const xmlChar *name,
+ const xmlChar *ns);
+XMLPUBFUN xmlSchemaValPtr XMLCALL
+ xmlSchemaNewQNameValue (const xmlChar *namespaceName,
+ const xmlChar *localName);
+XMLPUBFUN int XMLCALL
+ xmlSchemaCompareValuesWhtsp (xmlSchemaValPtr x,
+ xmlSchemaWhitespaceValueType xws,
+ xmlSchemaValPtr y,
+ xmlSchemaWhitespaceValueType yws);
+XMLPUBFUN xmlSchemaValPtr XMLCALL
+ xmlSchemaCopyValue (xmlSchemaValPtr val);
+XMLPUBFUN xmlSchemaValType XMLCALL
+ xmlSchemaGetValType (xmlSchemaValPtr val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_SCHEMAS_ENABLED */
+#endif /* __XML_SCHEMA_TYPES_H__ */
--- /dev/null
+/*
+ * Summary: set of routines to process strings
+ * Description: type and interfaces needed for the internal string handling
+ * of the library, especially UTF8 processing.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_STRING_H__
+#define __XML_STRING_H__
+
+#include <stdarg.h>
+#include <libxml/xmlversion.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * xmlChar:
+ *
+ * This is a basic byte in an UTF-8 encoded string.
+ * It's unsigned allowing to pinpoint case where char * are assigned
+ * to xmlChar * (possibly making serialization back impossible).
+ */
+typedef unsigned char xmlChar;
+
+/**
+ * BAD_CAST:
+ *
+ * Macro to cast a string to an xmlChar * when one know its safe.
+ */
+#define BAD_CAST (xmlChar *)
+
+/*
+ * xmlChar handling
+ */
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrdup (const xmlChar *cur);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrndup (const xmlChar *cur,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCharStrndup (const char *cur,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlCharStrdup (const char *cur);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrsub (const xmlChar *str,
+ int start,
+ int len);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlStrchr (const xmlChar *str,
+ xmlChar val);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlStrstr (const xmlChar *str,
+ const xmlChar *val);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlStrcasestr (const xmlChar *str,
+ const xmlChar *val);
+XMLPUBFUN int XMLCALL
+ xmlStrcmp (const xmlChar *str1,
+ const xmlChar *str2);
+XMLPUBFUN int XMLCALL
+ xmlStrncmp (const xmlChar *str1,
+ const xmlChar *str2,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlStrcasecmp (const xmlChar *str1,
+ const xmlChar *str2);
+XMLPUBFUN int XMLCALL
+ xmlStrncasecmp (const xmlChar *str1,
+ const xmlChar *str2,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlStrEqual (const xmlChar *str1,
+ const xmlChar *str2);
+XMLPUBFUN int XMLCALL
+ xmlStrQEqual (const xmlChar *pref,
+ const xmlChar *name,
+ const xmlChar *str);
+XMLPUBFUN int XMLCALL
+ xmlStrlen (const xmlChar *str);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrcat (xmlChar *cur,
+ const xmlChar *add);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrncat (xmlChar *cur,
+ const xmlChar *add,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlStrncatNew (const xmlChar *str1,
+ const xmlChar *str2,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlStrPrintf (xmlChar *buf,
+ int len,
+ const xmlChar *msg,
+ ...);
+XMLPUBFUN int XMLCALL
+ xmlStrVPrintf (xmlChar *buf,
+ int len,
+ const xmlChar *msg,
+ va_list ap);
+
+XMLPUBFUN int XMLCALL
+ xmlGetUTF8Char (const unsigned char *utf,
+ int *len);
+XMLPUBFUN int XMLCALL
+ xmlCheckUTF8 (const unsigned char *utf);
+XMLPUBFUN int XMLCALL
+ xmlUTF8Strsize (const xmlChar *utf,
+ int len);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlUTF8Strndup (const xmlChar *utf,
+ int len);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlUTF8Strpos (const xmlChar *utf,
+ int pos);
+XMLPUBFUN int XMLCALL
+ xmlUTF8Strloc (const xmlChar *utf,
+ const xmlChar *utfchar);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlUTF8Strsub (const xmlChar *utf,
+ int start,
+ int len);
+XMLPUBFUN int XMLCALL
+ xmlUTF8Strlen (const xmlChar *utf);
+XMLPUBFUN int XMLCALL
+ xmlUTF8Size (const xmlChar *utf);
+XMLPUBFUN int XMLCALL
+ xmlUTF8Charcmp (const xmlChar *utf1,
+ const xmlChar *utf2);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __XML_STRING_H__ */
--- /dev/null
+/*
+ * Summary: Unicode character APIs
+ * Description: API for the Unicode character APIs
+ *
+ * This file is automatically generated from the
+ * UCS description files of the Unicode Character Database
+ * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html
+ * using the genUnicode.py Python script.
+ *
+ * Generation date: Mon Mar 27 11:09:52 2006
+ * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_UNICODE_H__
+#define __XML_UNICODE_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_UNICODE_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+XMLPUBFUN int XMLCALL xmlUCSIsAegeanNumbers (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsAlphabeticPresentationForms (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsArabic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsArmenian (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsArrows (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBasicLatin (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBengali (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBlockElements (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBopomofo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBopomofoExtended (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBoxDrawing (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBraillePatterns (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsBuhid (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsByzantineMusicalSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibility (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityForms (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographs (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographsSupplement (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKRadicalsSupplement (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKSymbolsandPunctuation (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographs (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCherokee (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarks (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarksforSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCombiningHalfMarks (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCombiningMarksforSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsControlPictures (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCurrencySymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCypriotSyllabary (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCyrillic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCyrillicSupplement (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsDeseret (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsDevanagari (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsDingbats (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsEnclosedAlphanumerics (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsEnclosedCJKLettersandMonths (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsEthiopic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGeneralPunctuation (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGeometricShapes (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGeorgian (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGothic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGreek (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGreekExtended (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGreekandCoptic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGujarati (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsGurmukhi (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHalfwidthandFullwidthForms (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHangulCompatibilityJamo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHangulJamo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHangulSyllables (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHanunoo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHebrew (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHighPrivateUseSurrogates (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHighSurrogates (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsHiragana (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsIPAExtensions (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsIdeographicDescriptionCharacters (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKanbun (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKangxiRadicals (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKannada (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKatakana (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKatakanaPhoneticExtensions (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKhmer (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsKhmerSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLao (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLatin1Supplement (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedAdditional (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLetterlikeSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLimbu (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLinearBIdeograms (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLinearBSyllabary (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsLowSurrogates (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMalayalam (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMathematicalAlphanumericSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMathematicalOperators (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbolsandArrows (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousTechnical (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMongolian (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMusicalSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsMyanmar (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsNumberForms (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsOgham (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsOldItalic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsOpticalCharacterRecognition (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsOriya (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsOsmanya (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsPhoneticExtensions (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsPrivateUse (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsPrivateUseArea (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsRunic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsShavian (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSinhala (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSmallFormVariants (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSpacingModifierLetters (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSpecials (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSuperscriptsandSubscripts (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSupplementalMathematicalOperators (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaA (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaB (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsSyriac (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTagalog (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTagbanwa (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTags (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTaiLe (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTaiXuanJingSymbols (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTamil (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTelugu (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsThaana (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsThai (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsTibetan (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsUgaritic (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectors (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectorsSupplement (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsYiRadicals (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsYiSyllables (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsYijingHexagramSymbols (int code);
+
+XMLPUBFUN int XMLCALL xmlUCSIsBlock (int code, const char *block);
+
+XMLPUBFUN int XMLCALL xmlUCSIsCatC (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatCc (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatCf (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatCo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatCs (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatL (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatLl (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatLm (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatLo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatLt (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatLu (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatM (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatMc (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatMe (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatMn (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatN (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatNd (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatNl (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatNo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatP (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPc (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPd (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPe (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPf (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPi (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatPs (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatS (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatSc (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatSk (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatSm (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatSo (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatZ (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatZl (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatZp (int code);
+XMLPUBFUN int XMLCALL xmlUCSIsCatZs (int code);
+
+XMLPUBFUN int XMLCALL xmlUCSIsCat (int code, const char *cat);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_UNICODE_ENABLED */
+
+#endif /* __XML_UNICODE_H__ */
--- /dev/null
+/*\r
+ * Summary: compile-time version informations\r
+ * Description: compile-time version informations for the XML library\r
+ *\r
+ * Copy: See Copyright for the status of this software.\r
+ *\r
+ * Author: Daniel Veillard\r
+ */\r
+\r
+#ifndef __XML_VERSION_H__\r
+#define __XML_VERSION_H__\r
+\r
+#include <libxml/xmlexports.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*\r
+ * use those to be sure nothing nasty will happen if\r
+ * your library and includes mismatch\r
+ */\r
+#ifndef LIBXML2_COMPILING_MSCCDEF\r
+XMLPUBFUN void XMLCALL xmlCheckVersion(int version);\r
+#endif /* LIBXML2_COMPILING_MSCCDEF */\r
+\r
+/**\r
+ * LIBXML_DOTTED_VERSION:\r
+ *\r
+ * the version string like "1.2.3"\r
+ */\r
+#define LIBXML_DOTTED_VERSION "2.9.1"\r
+\r
+/**\r
+ * LIBXML_VERSION:\r
+ *\r
+ * the version number: 1.2.3 value is 10203\r
+ */\r
+#define LIBXML_VERSION 20901\r
+\r
+/**\r
+ * LIBXML_VERSION_STRING:\r
+ *\r
+ * the version number string, 1.2.3 value is "10203"\r
+ */\r
+#define LIBXML_VERSION_STRING "20901"\r
+\r
+/**\r
+ * LIBXML_VERSION_EXTRA:\r
+ *\r
+ * extra version information, used to show a CVS compilation\r
+ */\r
+#define LIBXML_VERSION_EXTRA ""\r
+\r
+/**\r
+ * LIBXML_TEST_VERSION:\r
+ *\r
+ * Macro to check that the libxml version in use is compatible with\r
+ * the version the software has been compiled against\r
+ */\r
+#define LIBXML_TEST_VERSION xmlCheckVersion(20901);\r
+\r
+#ifndef VMS\r
+#if 0\r
+/**\r
+ * WITH_TRIO:\r
+ *\r
+ * defined if the trio support need to be configured in\r
+ */\r
+#define WITH_TRIO\r
+#else\r
+/**\r
+ * WITHOUT_TRIO:\r
+ *\r
+ * defined if the trio support should not be configured in\r
+ */\r
+#define WITHOUT_TRIO\r
+#endif\r
+#else /* VMS */\r
+/**\r
+ * WITH_TRIO:\r
+ *\r
+ * defined if the trio support need to be configured in\r
+ */\r
+#define WITH_TRIO 1\r
+#endif /* VMS */\r
+\r
+/**\r
+ * LIBXML_THREAD_ENABLED:\r
+ *\r
+ * Whether the thread support is configured in\r
+ */\r
+#if 1\r
+#if defined(_REENTRANT) || defined(__MT__) || \\r
+ (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L))\r
+#define LIBXML_THREAD_ENABLED\r
+#endif\r
+#endif\r
+\r
+/**\r
+ * LIBXML_THREAD_ALLOC_ENABLED:\r
+ *\r
+ * Whether the allocation hooks are per-thread\r
+ */\r
+#if 0\r
+#define LIBXML_THREAD_ALLOC_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_TREE_ENABLED:\r
+ *\r
+ * Whether the DOM like tree manipulation API support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_TREE_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_OUTPUT_ENABLED:\r
+ *\r
+ * Whether the serialization/saving support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_OUTPUT_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_PUSH_ENABLED:\r
+ *\r
+ * Whether the push parsing interfaces are configured in\r
+ */\r
+#if 1\r
+#define LIBXML_PUSH_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_READER_ENABLED:\r
+ *\r
+ * Whether the xmlReader parsing interface is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_READER_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_PATTERN_ENABLED:\r
+ *\r
+ * Whether the xmlPattern node selection interface is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_PATTERN_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_WRITER_ENABLED:\r
+ *\r
+ * Whether the xmlWriter saving interface is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_WRITER_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_SAX1_ENABLED:\r
+ *\r
+ * Whether the older SAX1 interface is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_SAX1_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_FTP_ENABLED:\r
+ *\r
+ * Whether the FTP support is configured in\r
+ */\r
+#if 0\r
+#define LIBXML_FTP_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_HTTP_ENABLED:\r
+ *\r
+ * Whether the HTTP support is configured in\r
+ */\r
+#if 0\r
+#define LIBXML_HTTP_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_VALID_ENABLED:\r
+ *\r
+ * Whether the DTD validation support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_VALID_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_HTML_ENABLED:\r
+ *\r
+ * Whether the HTML support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_HTML_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_LEGACY_ENABLED:\r
+ *\r
+ * Whether the deprecated APIs are compiled in for compatibility\r
+ */\r
+#if 1\r
+#define LIBXML_LEGACY_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_C14N_ENABLED:\r
+ *\r
+ * Whether the Canonicalization support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_C14N_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_CATALOG_ENABLED:\r
+ *\r
+ * Whether the Catalog support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_CATALOG_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_DOCB_ENABLED:\r
+ *\r
+ * Whether the SGML Docbook support is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_DOCB_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_XPATH_ENABLED:\r
+ *\r
+ * Whether XPath is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_XPATH_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_XPTR_ENABLED:\r
+ *\r
+ * Whether XPointer is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_XPTR_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_XINCLUDE_ENABLED:\r
+ *\r
+ * Whether XInclude is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_XINCLUDE_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_ICONV_ENABLED:\r
+ *\r
+ * Whether iconv support is available\r
+ */\r
+#if 0\r
+#define LIBXML_ICONV_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_ICU_ENABLED:\r
+ *\r
+ * Whether icu support is available\r
+ */\r
+#if 0\r
+#define LIBXML_ICU_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_ISO8859X_ENABLED:\r
+ *\r
+ * Whether ISO-8859-* support is made available in case iconv is not\r
+ */\r
+#if 0\r
+#define LIBXML_ISO8859X_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_DEBUG_ENABLED:\r
+ *\r
+ * Whether Debugging module is configured in\r
+ */\r
+#if 1\r
+#define LIBXML_DEBUG_ENABLED\r
+#endif\r
+\r
+/**\r
+ * DEBUG_MEMORY_LOCATION:\r
+ *\r
+ * Whether the memory debugging is configured in\r
+ */\r
+#if 0\r
+#define DEBUG_MEMORY_LOCATION\r
+#endif\r
+\r
+/**\r
+ * LIBXML_DEBUG_RUNTIME:\r
+ *\r
+ * Whether the runtime debugging is configured in\r
+ */\r
+#if 0\r
+#define LIBXML_DEBUG_RUNTIME\r
+#endif\r
+\r
+/**\r
+ * LIBXML_UNICODE_ENABLED:\r
+ *\r
+ * Whether the Unicode related interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_UNICODE_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_REGEXP_ENABLED:\r
+ *\r
+ * Whether the regular expressions interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_REGEXP_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_AUTOMATA_ENABLED:\r
+ *\r
+ * Whether the automata interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_AUTOMATA_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_EXPR_ENABLED:\r
+ *\r
+ * Whether the formal expressions interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_EXPR_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_SCHEMAS_ENABLED:\r
+ *\r
+ * Whether the Schemas validation interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_SCHEMAS_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_SCHEMATRON_ENABLED:\r
+ *\r
+ * Whether the Schematron validation interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_SCHEMATRON_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_MODULES_ENABLED:\r
+ *\r
+ * Whether the module interfaces are compiled in\r
+ */\r
+#if 1\r
+#define LIBXML_MODULES_ENABLED\r
+/**\r
+ * LIBXML_MODULE_EXTENSION:\r
+ *\r
+ * the string suffix used by dynamic modules (usually shared libraries)\r
+ */\r
+#define LIBXML_MODULE_EXTENSION ".dll" \r
+#endif\r
+\r
+/**\r
+ * LIBXML_ZLIB_ENABLED:\r
+ *\r
+ * Whether the Zlib support is compiled in\r
+ */\r
+#if 0\r
+#define LIBXML_ZLIB_ENABLED\r
+#endif\r
+\r
+/**\r
+ * LIBXML_LZMA_ENABLED:\r
+ *\r
+ * Whether the Lzma support is compiled in\r
+ */\r
+#if 0\r
+#define LIBXML_LZMA_ENABLED\r
+#endif\r
+\r
+#ifdef __GNUC__\r
+#ifdef HAVE_ANSIDECL_H\r
+#include <ansidecl.h>\r
+#endif\r
+\r
+/**\r
+ * ATTRIBUTE_UNUSED:\r
+ *\r
+ * Macro used to signal to GCC unused function parameters\r
+ */\r
+\r
+#ifndef ATTRIBUTE_UNUSED\r
+# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))\r
+# define ATTRIBUTE_UNUSED __attribute__((unused))\r
+# else\r
+# define ATTRIBUTE_UNUSED\r
+# endif\r
+#endif\r
+\r
+/**\r
+ * LIBXML_ATTR_ALLOC_SIZE:\r
+ *\r
+ * Macro used to indicate to GCC this is an allocator function\r
+ */\r
+\r
+#ifndef LIBXML_ATTR_ALLOC_SIZE\r
+# if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))\r
+# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x)))\r
+# else\r
+# define LIBXML_ATTR_ALLOC_SIZE(x)\r
+# endif\r
+#else\r
+# define LIBXML_ATTR_ALLOC_SIZE(x)\r
+#endif\r
+\r
+/**\r
+ * LIBXML_ATTR_FORMAT:\r
+ *\r
+ * Macro used to indicate to GCC the parameter are printf like\r
+ */\r
+\r
+#ifndef LIBXML_ATTR_FORMAT\r
+# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))\r
+# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args)))\r
+# else\r
+# define LIBXML_ATTR_FORMAT(fmt,args)\r
+# endif\r
+#else\r
+# define LIBXML_ATTR_FORMAT(fmt,args)\r
+#endif\r
+\r
+#else /* ! __GNUC__ */\r
+/**\r
+ * ATTRIBUTE_UNUSED:\r
+ *\r
+ * Macro used to signal to GCC unused function parameters\r
+ */\r
+#define ATTRIBUTE_UNUSED\r
+/**\r
+ * LIBXML_ATTR_ALLOC_SIZE:\r
+ *\r
+ * Macro used to indicate to GCC this is an allocator function\r
+ */\r
+#define LIBXML_ATTR_ALLOC_SIZE(x)\r
+/**\r
+ * LIBXML_ATTR_FORMAT:\r
+ *\r
+ * Macro used to indicate to GCC the parameter are printf like\r
+ */\r
+#define LIBXML_ATTR_FORMAT(fmt,args)\r
+#endif /* __GNUC__ */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif /* __cplusplus */\r
+#endif\r
+\r
+\r
--- /dev/null
+/*
+ * Summary: compile-time version informations on Windows
+ * Description: compile-time version informations for the XML library
+ * when compiled on the Windows platform
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_VERSION_H__
+#define __XML_VERSION_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * use those to be sure nothing nasty will happen if
+ * your library and includes mismatch
+ */
+#ifndef LIBXML2_COMPILING_MSCCDEF
+extern void xmlCheckVersion(int version);
+#endif /* LIBXML2_COMPILING_MSCCDEF */
+
+/**
+ * LIBXML_DOTTED_VERSION:
+ *
+ * the version string like "1.2.3"
+ */
+#define LIBXML_DOTTED_VERSION "2.4.26"
+
+/**
+ * LIBXML_VERSION:
+ *
+ * the version number: 1.2.3 value is 1002003
+ */
+#define LIBXML_VERSION 20426
+
+/**
+ * LIBXML_VERSION_STRING:
+ *
+ * the version number string, 1.2.3 value is "1002003"
+ */
+#define LIBXML_VERSION_STRING "20426"
+
+/**
+ * LIBXML_TEST_VERSION:
+ *
+ * Macro to check that the libxml version in use is compatible with
+ * the version the software has been compiled against
+ */
+#define LIBXML_TEST_VERSION xmlCheckVersion(20426);
+
+#if 0
+/**
+ * WITH_TRIO:
+ *
+ * defined if the trio support need to be configured in
+ */
+#define WITH_TRIO
+#else
+/**
+ * WITHOUT_TRIO:
+ *
+ * defined if the trio support should not be configured in
+ */
+#define WITHOUT_TRIO
+#endif
+
+/**
+ * LIBXML_THREAD_ENABLED:
+ *
+ * Whether the thread support is configured in
+ */
+#if 0
+#define LIBXML_THREAD_ENABLED
+#endif
+
+/**
+ * LIBXML_FTP_ENABLED:
+ *
+ * Whether the FTP support is configured in
+ */
+#if 1
+#define LIBXML_FTP_ENABLED
+#endif
+
+/**
+ * LIBXML_HTTP_ENABLED:
+ *
+ * Whether the HTTP support is configured in
+ */
+#if 1
+#define LIBXML_HTTP_ENABLED
+#endif
+
+/**
+ * LIBXML_HTML_ENABLED:
+ *
+ * Whether the HTML support is configured in
+ */
+#if 1
+#define LIBXML_HTML_ENABLED
+#endif
+
+/**
+ * LIBXML_CATALOG_ENABLED:
+ *
+ * Whether the Catalog support is configured in
+ */
+#if 1
+#define LIBXML_CATALOG_ENABLED
+#endif
+
+/**
+ * LIBXML_DOCB_ENABLED:
+ *
+ * Whether the SGML Docbook support is configured in
+ */
+#if 1
+#define LIBXML_DOCB_ENABLED
+#endif
+
+/**
+ * LIBXML_XPATH_ENABLED:
+ *
+ * Whether XPath is configured in
+ */
+#if 1
+#define LIBXML_XPATH_ENABLED
+#endif
+
+/**
+ * LIBXML_XPTR_ENABLED:
+ *
+ * Whether XPointer is configured in
+ */
+#if 1
+#define LIBXML_XPTR_ENABLED
+#endif
+
+/**
+ * LIBXML_C14N_ENABLED:
+ *
+ * Whether the Canonicalization support is configured in
+ */
+#if 0
+#define LIBXML_C14N_ENABLED
+#endif
+
+/**
+ * LIBXML_XINCLUDE_ENABLED:
+ *
+ * Whether XInclude is configured in
+ */
+#if 1
+#define LIBXML_XINCLUDE_ENABLED
+#endif
+
+/**
+ * LIBXML_ICONV_ENABLED:
+ *
+ * Whether iconv support is available
+ */
+#if 0
+#define LIBXML_ICONV_ENABLED
+#endif
+
+/**
+ * LIBXML_DEBUG_ENABLED:
+ *
+ * Whether Debugging module is configured in
+ */
+#if 1
+#define LIBXML_DEBUG_ENABLED
+#endif
+
+/**
+ * DEBUG_MEMORY_LOCATION:
+ *
+ * Whether the memory debugging is configured in
+ */
+#if 0
+#define DEBUG_MEMORY_LOCATION
+#endif
+
+/**
+ * LIBXML_DLL_IMPORT:
+ *
+ * Used on Windows (MS C compiler only) to declare a variable as
+ * imported from the library. This macro should be empty when compiling
+ * libxml itself. It should expand to __declspec(dllimport)
+ * when the client code includes this header, and that only if the client
+ * links dynamically against libxml.
+ * For this to work, we need three macros. One tells us which compiler is
+ * being used and luckily the compiler defines such a thing: _MSC_VER. The
+ * second macro tells us if we are compiling libxml or the client code and
+ * we define the macro IN_LIBXML on the compiler's command line for this
+ * purpose. The third macro, LIBXML_STATIC, must be defined by any client
+ * code which links against libxml statically.
+ */
+#ifndef LIBXML_DLL_IMPORT
+#if defined(_MSC_VER) && !defined(IN_LIBXML) && !defined(LIBXML_STATIC)
+#define LIBXML_DLL_IMPORT __declspec(dllimport)
+#else
+#define LIBXML_DLL_IMPORT
+#endif
+#endif
+
+/**
+ * ATTRIBUTE_UNUSED:
+ *
+ * Macro used to signal to GCC unused function parameters
+ */
+#ifdef __GNUC__
+#ifdef HAVE_ANSIDECL_H
+#include <ansidecl.h>
+#endif
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED
+#endif
+#else
+#define ATTRIBUTE_UNUSED
+#endif
+
+/*
+ * #pragma comment(lib, "iconv.lib")
+ *
+ * pragma understood my MS compiler which enables a conditional link with
+ * iconv.
+ */
+#ifdef _MSC_VER
+#if defined LIBXML_ICONV_ENABLED && !defined LIBXML2_COMPILING_MSCCDEF
+#pragma comment(lib, "iconv.lib")
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null
+/*
+ * Summary: text writing API for XML
+ * Description: text writing API for XML
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Alfred Mickautsch <alfred@mickautsch.de>
+ */
+
+#ifndef __XML_XMLWRITER_H__
+#define __XML_XMLWRITER_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_WRITER_ENABLED
+
+#include <stdarg.h>
+#include <libxml/xmlIO.h>
+#include <libxml/list.h>
+#include <libxml/xmlstring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef struct _xmlTextWriter xmlTextWriter;
+ typedef xmlTextWriter *xmlTextWriterPtr;
+
+/*
+ * Constructors & Destructor
+ */
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriter(xmlOutputBufferPtr out);
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriterFilename(const char *uri, int compression);
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriterMemory(xmlBufferPtr buf, int compression);
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, int compression);
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriterDoc(xmlDocPtr * doc, int compression);
+ XMLPUBFUN xmlTextWriterPtr XMLCALL
+ xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node,
+ int compression);
+ XMLPUBFUN void XMLCALL xmlFreeTextWriter(xmlTextWriterPtr writer);
+
+/*
+ * Functions
+ */
+
+
+/*
+ * Document
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartDocument(xmlTextWriterPtr writer,
+ const char *version,
+ const char *encoding,
+ const char *standalone);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndDocument(xmlTextWriterPtr
+ writer);
+
+/*
+ * Comments
+ */
+ XMLPUBFUN int XMLCALL xmlTextWriterStartComment(xmlTextWriterPtr
+ writer);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndComment(xmlTextWriterPtr writer);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(2,3);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(2,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteComment(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ content);
+
+/*
+ * Elements
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartElement(xmlTextWriterPtr writer,
+ const xmlChar * name);
+ XMLPUBFUN int XMLCALL xmlTextWriterStartElementNS(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ prefix,
+ const xmlChar * name,
+ const xmlChar *
+ namespaceURI);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndElement(xmlTextWriterPtr writer);
+ XMLPUBFUN int XMLCALL xmlTextWriterFullEndElement(xmlTextWriterPtr
+ writer);
+
+/*
+ * Elements conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(3,4);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(3,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteElement(xmlTextWriterPtr
+ writer,
+ const xmlChar * name,
+ const xmlChar *
+ content);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
+ const xmlChar * prefix,
+ const xmlChar * name,
+ const xmlChar * namespaceURI,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(5,6);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
+ const xmlChar * prefix,
+ const xmlChar * name,
+ const xmlChar * namespaceURI,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(5,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteElementNS(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ prefix,
+ const xmlChar * name,
+ const xmlChar *
+ namespaceURI,
+ const xmlChar *
+ content);
+
+/*
+ * Text
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(2,3);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer,
+ const char *format, va_list argptr)
+ LIBXML_ATTR_FORMAT(2,0);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteRawLen(xmlTextWriterPtr writer,
+ const xmlChar * content, int len);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteRaw(xmlTextWriterPtr writer,
+ const xmlChar * content);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatString(xmlTextWriterPtr
+ writer,
+ const char
+ *format, ...)
+ LIBXML_ATTR_FORMAT(2,3);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatString(xmlTextWriterPtr
+ writer,
+ const char
+ *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(2,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteString(xmlTextWriterPtr writer,
+ const xmlChar *
+ content);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteBase64(xmlTextWriterPtr writer,
+ const char *data,
+ int start, int len);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteBinHex(xmlTextWriterPtr writer,
+ const char *data,
+ int start, int len);
+
+/*
+ * Attributes
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartAttribute(xmlTextWriterPtr writer,
+ const xmlChar * name);
+ XMLPUBFUN int XMLCALL xmlTextWriterStartAttributeNS(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ prefix,
+ const xmlChar *
+ name,
+ const xmlChar *
+ namespaceURI);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndAttribute(xmlTextWriterPtr
+ writer);
+
+/*
+ * Attributes conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(3,4);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(3,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteAttribute(xmlTextWriterPtr
+ writer,
+ const xmlChar * name,
+ const xmlChar *
+ content);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
+ const xmlChar * prefix,
+ const xmlChar * name,
+ const xmlChar * namespaceURI,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(5,6);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
+ const xmlChar * prefix,
+ const xmlChar * name,
+ const xmlChar * namespaceURI,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(5,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteAttributeNS(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ prefix,
+ const xmlChar *
+ name,
+ const xmlChar *
+ namespaceURI,
+ const xmlChar *
+ content);
+
+/*
+ * PI's
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartPI(xmlTextWriterPtr writer,
+ const xmlChar * target);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndPI(xmlTextWriterPtr writer);
+
+/*
+ * PI conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer,
+ const xmlChar * target,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(3,4);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
+ const xmlChar * target,
+ const char *format, va_list argptr)
+ LIBXML_ATTR_FORMAT(3,0);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWritePI(xmlTextWriterPtr writer,
+ const xmlChar * target,
+ const xmlChar * content);
+
+/**
+ * xmlTextWriterWriteProcessingInstruction:
+ *
+ * This macro maps to xmlTextWriterWritePI
+ */
+#define xmlTextWriterWriteProcessingInstruction xmlTextWriterWritePI
+
+/*
+ * CDATA
+ */
+ XMLPUBFUN int XMLCALL xmlTextWriterStartCDATA(xmlTextWriterPtr writer);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndCDATA(xmlTextWriterPtr writer);
+
+/*
+ * CDATA conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(2,3);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer,
+ const char *format, va_list argptr)
+ LIBXML_ATTR_FORMAT(2,0);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteCDATA(xmlTextWriterPtr writer,
+ const xmlChar * content);
+
+/*
+ * DTD
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartDTD(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndDTD(xmlTextWriterPtr writer);
+
+/*
+ * DTD conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(5,6);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid,
+ const char *format, va_list argptr)
+ LIBXML_ATTR_FORMAT(5,0);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteDTD(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid,
+ const xmlChar * subset);
+
+/**
+ * xmlTextWriterWriteDocType:
+ *
+ * this macro maps to xmlTextWriterWriteDTD
+ */
+#define xmlTextWriterWriteDocType xmlTextWriterWriteDTD
+
+/*
+ * DTD element definition
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartDTDElement(xmlTextWriterPtr writer,
+ const xmlChar * name);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndDTDElement(xmlTextWriterPtr
+ writer);
+
+/*
+ * DTD element definition conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(3,4);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(3,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDElement(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ name,
+ const xmlChar *
+ content);
+
+/*
+ * DTD attribute list definition
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer,
+ const xmlChar * name);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndDTDAttlist(xmlTextWriterPtr
+ writer);
+
+/*
+ * DTD attribute list definition conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(3,4);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(3,0);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr
+ writer,
+ const xmlChar *
+ name,
+ const xmlChar *
+ content);
+
+/*
+ * DTD entity definition
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
+ int pe, const xmlChar * name);
+ XMLPUBFUN int XMLCALL xmlTextWriterEndDTDEntity(xmlTextWriterPtr
+ writer);
+
+/*
+ * DTD entity definition conveniency functions
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
+ int pe,
+ const xmlChar * name,
+ const char *format, ...)
+ LIBXML_ATTR_FORMAT(4,5);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
+ int pe,
+ const xmlChar * name,
+ const char *format,
+ va_list argptr)
+ LIBXML_ATTR_FORMAT(4,0);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
+ int pe,
+ const xmlChar * name,
+ const xmlChar * content);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
+ int pe,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid,
+ const xmlChar * ndataid);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr
+ writer,
+ const xmlChar * pubid,
+ const xmlChar * sysid,
+ const xmlChar *
+ ndataid);
+ XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDEntity(xmlTextWriterPtr
+ writer, int pe,
+ const xmlChar * name,
+ const xmlChar *
+ pubid,
+ const xmlChar *
+ sysid,
+ const xmlChar *
+ ndataid,
+ const xmlChar *
+ content);
+
+/*
+ * DTD notation definition
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
+ const xmlChar * name,
+ const xmlChar * pubid,
+ const xmlChar * sysid);
+
+/*
+ * Indentation
+ */
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent);
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterSetIndentString(xmlTextWriterPtr writer,
+ const xmlChar * str);
+
+ XMLPUBFUN int XMLCALL
+ xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar);
+
+
+/*
+ * misc
+ */
+ XMLPUBFUN int XMLCALL xmlTextWriterFlush(xmlTextWriterPtr writer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_WRITER_ENABLED */
+
+#endif /* __XML_XMLWRITER_H__ */
--- /dev/null
+/*
+ * Summary: XML Path Language implementation
+ * Description: API for the XML Path Language implementation
+ *
+ * XML Path Language implementation
+ * XPath is a language for addressing parts of an XML document,
+ * designed to be used by both XSLT and XPointer
+ * http://www.w3.org/TR/xpath
+ *
+ * Implements
+ * W3C Recommendation 16 November 1999
+ * http://www.w3.org/TR/1999/REC-xpath-19991116
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XPATH_H__
+#define __XML_XPATH_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_XPATH_ENABLED
+
+#include <libxml/xmlerror.h>
+#include <libxml/tree.h>
+#include <libxml/hash.h>
+#endif /* LIBXML_XPATH_ENABLED */
+
+#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+#ifdef __cplusplus
+extern "C" {
+#endif
+#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */
+
+#ifdef LIBXML_XPATH_ENABLED
+
+typedef struct _xmlXPathContext xmlXPathContext;
+typedef xmlXPathContext *xmlXPathContextPtr;
+typedef struct _xmlXPathParserContext xmlXPathParserContext;
+typedef xmlXPathParserContext *xmlXPathParserContextPtr;
+
+/**
+ * The set of XPath error codes.
+ */
+
+typedef enum {
+ XPATH_EXPRESSION_OK = 0,
+ XPATH_NUMBER_ERROR,
+ XPATH_UNFINISHED_LITERAL_ERROR,
+ XPATH_START_LITERAL_ERROR,
+ XPATH_VARIABLE_REF_ERROR,
+ XPATH_UNDEF_VARIABLE_ERROR,
+ XPATH_INVALID_PREDICATE_ERROR,
+ XPATH_EXPR_ERROR,
+ XPATH_UNCLOSED_ERROR,
+ XPATH_UNKNOWN_FUNC_ERROR,
+ XPATH_INVALID_OPERAND,
+ XPATH_INVALID_TYPE,
+ XPATH_INVALID_ARITY,
+ XPATH_INVALID_CTXT_SIZE,
+ XPATH_INVALID_CTXT_POSITION,
+ XPATH_MEMORY_ERROR,
+ XPTR_SYNTAX_ERROR,
+ XPTR_RESOURCE_ERROR,
+ XPTR_SUB_RESOURCE_ERROR,
+ XPATH_UNDEF_PREFIX_ERROR,
+ XPATH_ENCODING_ERROR,
+ XPATH_INVALID_CHAR_ERROR,
+ XPATH_INVALID_CTXT,
+ XPATH_STACK_ERROR,
+ XPATH_FORBID_VARIABLE_ERROR
+} xmlXPathError;
+
+/*
+ * A node-set (an unordered collection of nodes without duplicates).
+ */
+typedef struct _xmlNodeSet xmlNodeSet;
+typedef xmlNodeSet *xmlNodeSetPtr;
+struct _xmlNodeSet {
+ int nodeNr; /* number of nodes in the set */
+ int nodeMax; /* size of the array as allocated */
+ xmlNodePtr *nodeTab; /* array of nodes in no particular order */
+ /* @@ with_ns to check wether namespace nodes should be looked at @@ */
+};
+
+/*
+ * An expression is evaluated to yield an object, which
+ * has one of the following four basic types:
+ * - node-set
+ * - boolean
+ * - number
+ * - string
+ *
+ * @@ XPointer will add more types !
+ */
+
+typedef enum {
+ XPATH_UNDEFINED = 0,
+ XPATH_NODESET = 1,
+ XPATH_BOOLEAN = 2,
+ XPATH_NUMBER = 3,
+ XPATH_STRING = 4,
+ XPATH_POINT = 5,
+ XPATH_RANGE = 6,
+ XPATH_LOCATIONSET = 7,
+ XPATH_USERS = 8,
+ XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */
+} xmlXPathObjectType;
+
+typedef struct _xmlXPathObject xmlXPathObject;
+typedef xmlXPathObject *xmlXPathObjectPtr;
+struct _xmlXPathObject {
+ xmlXPathObjectType type;
+ xmlNodeSetPtr nodesetval;
+ int boolval;
+ double floatval;
+ xmlChar *stringval;
+ void *user;
+ int index;
+ void *user2;
+ int index2;
+};
+
+/**
+ * xmlXPathConvertFunc:
+ * @obj: an XPath object
+ * @type: the number of the target type
+ *
+ * A conversion function is associated to a type and used to cast
+ * the new type to primitive values.
+ *
+ * Returns -1 in case of error, 0 otherwise
+ */
+typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
+
+/*
+ * Extra type: a name and a conversion function.
+ */
+
+typedef struct _xmlXPathType xmlXPathType;
+typedef xmlXPathType *xmlXPathTypePtr;
+struct _xmlXPathType {
+ const xmlChar *name; /* the type name */
+ xmlXPathConvertFunc func; /* the conversion function */
+};
+
+/*
+ * Extra variable: a name and a value.
+ */
+
+typedef struct _xmlXPathVariable xmlXPathVariable;
+typedef xmlXPathVariable *xmlXPathVariablePtr;
+struct _xmlXPathVariable {
+ const xmlChar *name; /* the variable name */
+ xmlXPathObjectPtr value; /* the value */
+};
+
+/**
+ * xmlXPathEvalFunc:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments passed to the function
+ *
+ * An XPath evaluation function, the parameters are on the XPath context stack.
+ */
+
+typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,
+ int nargs);
+
+/*
+ * Extra function: a name and a evaluation function.
+ */
+
+typedef struct _xmlXPathFunct xmlXPathFunct;
+typedef xmlXPathFunct *xmlXPathFuncPtr;
+struct _xmlXPathFunct {
+ const xmlChar *name; /* the function name */
+ xmlXPathEvalFunc func; /* the evaluation function */
+};
+
+/**
+ * xmlXPathAxisFunc:
+ * @ctxt: the XPath interpreter context
+ * @cur: the previous node being explored on that axis
+ *
+ * An axis traversal function. To traverse an axis, the engine calls
+ * the first time with cur == NULL and repeat until the function returns
+ * NULL indicating the end of the axis traversal.
+ *
+ * Returns the next node in that axis or NULL if at the end of the axis.
+ */
+
+typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,
+ xmlXPathObjectPtr cur);
+
+/*
+ * Extra axis: a name and an axis function.
+ */
+
+typedef struct _xmlXPathAxis xmlXPathAxis;
+typedef xmlXPathAxis *xmlXPathAxisPtr;
+struct _xmlXPathAxis {
+ const xmlChar *name; /* the axis name */
+ xmlXPathAxisFunc func; /* the search function */
+};
+
+/**
+ * xmlXPathFunction:
+ * @ctxt: the XPath interprestation context
+ * @nargs: the number of arguments
+ *
+ * An XPath function.
+ * The arguments (if any) are popped out from the context stack
+ * and the result is pushed on the stack.
+ */
+
+typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
+
+/*
+ * Function and Variable Lookup.
+ */
+
+/**
+ * xmlXPathVariableLookupFunc:
+ * @ctxt: an XPath context
+ * @name: name of the variable
+ * @ns_uri: the namespace name hosting this variable
+ *
+ * Prototype for callbacks used to plug variable lookup in the XPath
+ * engine.
+ *
+ * Returns the XPath object value or NULL if not found.
+ */
+typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri);
+
+/**
+ * xmlXPathFuncLookupFunc:
+ * @ctxt: an XPath context
+ * @name: name of the function
+ * @ns_uri: the namespace name hosting this function
+ *
+ * Prototype for callbacks used to plug function lookup in the XPath
+ * engine.
+ *
+ * Returns the XPath function or NULL if not found.
+ */
+typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri);
+
+/**
+ * xmlXPathFlags:
+ * Flags for XPath engine compilation and runtime
+ */
+/**
+ * XML_XPATH_CHECKNS:
+ *
+ * check namespaces at compilation
+ */
+#define XML_XPATH_CHECKNS (1<<0)
+/**
+ * XML_XPATH_NOVAR:
+ *
+ * forbid variables in expression
+ */
+#define XML_XPATH_NOVAR (1<<1)
+
+/**
+ * xmlXPathContext:
+ *
+ * Expression evaluation occurs with respect to a context.
+ * he context consists of:
+ * - a node (the context node)
+ * - a node list (the context node list)
+ * - a set of variable bindings
+ * - a function library
+ * - the set of namespace declarations in scope for the expression
+ * Following the switch to hash tables, this need to be trimmed up at
+ * the next binary incompatible release.
+ * The node may be modified when the context is passed to libxml2
+ * for an XPath evaluation so you may need to initialize it again
+ * before the next call.
+ */
+
+struct _xmlXPathContext {
+ xmlDocPtr doc; /* The current document */
+ xmlNodePtr node; /* The current node */
+
+ int nb_variables_unused; /* unused (hash table) */
+ int max_variables_unused; /* unused (hash table) */
+ xmlHashTablePtr varHash; /* Hash table of defined variables */
+
+ int nb_types; /* number of defined types */
+ int max_types; /* max number of types */
+ xmlXPathTypePtr types; /* Array of defined types */
+
+ int nb_funcs_unused; /* unused (hash table) */
+ int max_funcs_unused; /* unused (hash table) */
+ xmlHashTablePtr funcHash; /* Hash table of defined funcs */
+
+ int nb_axis; /* number of defined axis */
+ int max_axis; /* max number of axis */
+ xmlXPathAxisPtr axis; /* Array of defined axis */
+
+ /* the namespace nodes of the context node */
+ xmlNsPtr *namespaces; /* Array of namespaces */
+ int nsNr; /* number of namespace in scope */
+ void *user; /* function to free */
+
+ /* extra variables */
+ int contextSize; /* the context size */
+ int proximityPosition; /* the proximity position */
+
+ /* extra stuff for XPointer */
+ int xptr; /* is this an XPointer context? */
+ xmlNodePtr here; /* for here() */
+ xmlNodePtr origin; /* for origin() */
+
+ /* the set of namespace declarations in scope for the expression */
+ xmlHashTablePtr nsHash; /* The namespaces hash table */
+ xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */
+ void *varLookupData; /* variable lookup data */
+
+ /* Possibility to link in an extra item */
+ void *extra; /* needed for XSLT */
+
+ /* The function name and URI when calling a function */
+ const xmlChar *function;
+ const xmlChar *functionURI;
+
+ /* function lookup function and data */
+ xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */
+ void *funcLookupData; /* function lookup data */
+
+ /* temporary namespace lists kept for walking the namespace axis */
+ xmlNsPtr *tmpNsList; /* Array of namespaces */
+ int tmpNsNr; /* number of namespaces in scope */
+
+ /* error reporting mechanism */
+ void *userData; /* user specific data block */
+ xmlStructuredErrorFunc error; /* the callback in case of errors */
+ xmlError lastError; /* the last error */
+ xmlNodePtr debugNode; /* the source node XSLT */
+
+ /* dictionary */
+ xmlDictPtr dict; /* dictionary if any */
+
+ int flags; /* flags to control compilation */
+
+ /* Cache for reusal of XPath objects */
+ void *cache;
+};
+
+/*
+ * The structure of a compiled expression form is not public.
+ */
+
+typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
+typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
+
+/**
+ * xmlXPathParserContext:
+ *
+ * An XPath parser context. It contains pure parsing informations,
+ * an xmlXPathContext, and the stack of objects.
+ */
+struct _xmlXPathParserContext {
+ const xmlChar *cur; /* the current char being parsed */
+ const xmlChar *base; /* the full expression */
+
+ int error; /* error code */
+
+ xmlXPathContextPtr context; /* the evaluation context */
+ xmlXPathObjectPtr value; /* the current value */
+ int valueNr; /* number of values stacked */
+ int valueMax; /* max number of values stacked */
+ xmlXPathObjectPtr *valueTab; /* stack of values */
+
+ xmlXPathCompExprPtr comp; /* the precompiled expression */
+ int xptr; /* it this an XPointer expression */
+ xmlNodePtr ancestor; /* used for walking preceding axis */
+
+ int valueFrame; /* used to limit Pop on the stack */
+};
+
+/************************************************************************
+ * *
+ * Public API *
+ * *
+ ************************************************************************/
+
+/**
+ * Objects and Nodesets handling
+ */
+
+XMLPUBVAR double xmlXPathNAN;
+XMLPUBVAR double xmlXPathPINF;
+XMLPUBVAR double xmlXPathNINF;
+
+/* These macros may later turn into functions */
+/**
+ * xmlXPathNodeSetGetLength:
+ * @ns: a node-set
+ *
+ * Implement a functionality similar to the DOM NodeList.length.
+ *
+ * Returns the number of nodes in the node-set.
+ */
+#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
+/**
+ * xmlXPathNodeSetItem:
+ * @ns: a node-set
+ * @index: index of a node in the set
+ *
+ * Implements a functionality similar to the DOM NodeList.item().
+ *
+ * Returns the xmlNodePtr at the given @index in @ns or NULL if
+ * @index is out of range (0 to length-1)
+ */
+#define xmlXPathNodeSetItem(ns, index) \
+ ((((ns) != NULL) && \
+ ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
+ (ns)->nodeTab[(index)] \
+ : NULL)
+/**
+ * xmlXPathNodeSetIsEmpty:
+ * @ns: a node-set
+ *
+ * Checks whether @ns is empty or not.
+ *
+ * Returns %TRUE if @ns is an empty node-set.
+ */
+#define xmlXPathNodeSetIsEmpty(ns) \
+ (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))
+
+
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeObject (xmlXPathObjectPtr obj);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeSetCreate (xmlNodePtr val);
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathObjectCopy (xmlXPathObjectPtr val);
+XMLPUBFUN int XMLCALL
+ xmlXPathCmpNodes (xmlNodePtr node1,
+ xmlNodePtr node2);
+/**
+ * Conversion functions to basic types.
+ */
+XMLPUBFUN int XMLCALL
+ xmlXPathCastNumberToBoolean (double val);
+XMLPUBFUN int XMLCALL
+ xmlXPathCastStringToBoolean (const xmlChar * val);
+XMLPUBFUN int XMLCALL
+ xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);
+XMLPUBFUN int XMLCALL
+ xmlXPathCastToBoolean (xmlXPathObjectPtr val);
+
+XMLPUBFUN double XMLCALL
+ xmlXPathCastBooleanToNumber (int val);
+XMLPUBFUN double XMLCALL
+ xmlXPathCastStringToNumber (const xmlChar * val);
+XMLPUBFUN double XMLCALL
+ xmlXPathCastNodeToNumber (xmlNodePtr node);
+XMLPUBFUN double XMLCALL
+ xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
+XMLPUBFUN double XMLCALL
+ xmlXPathCastToNumber (xmlXPathObjectPtr val);
+
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathCastBooleanToString (int val);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathCastNumberToString (double val);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathCastNodeToString (xmlNodePtr node);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathCastToString (xmlXPathObjectPtr val);
+
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathConvertBoolean (xmlXPathObjectPtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathConvertNumber (xmlXPathObjectPtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathConvertString (xmlXPathObjectPtr val);
+
+/**
+ * Context handling.
+ */
+XMLPUBFUN xmlXPathContextPtr XMLCALL
+ xmlXPathNewContext (xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeContext (xmlXPathContextPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlXPathContextSetCache(xmlXPathContextPtr ctxt,
+ int active,
+ int value,
+ int options);
+/**
+ * Evaluation functions.
+ */
+XMLPUBFUN long XMLCALL
+ xmlXPathOrderDocElems (xmlDocPtr doc);
+XMLPUBFUN int XMLCALL
+ xmlXPathSetContextNode (xmlNodePtr node,
+ xmlXPathContextPtr ctx);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNodeEval (xmlNodePtr node,
+ const xmlChar *str,
+ xmlXPathContextPtr ctx);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathEval (const xmlChar *str,
+ xmlXPathContextPtr ctx);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathEvalExpression (const xmlChar *str,
+ xmlXPathContextPtr ctxt);
+XMLPUBFUN int XMLCALL
+ xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
+ xmlXPathObjectPtr res);
+/**
+ * Separate compilation/evaluation entry points.
+ */
+XMLPUBFUN xmlXPathCompExprPtr XMLCALL
+ xmlXPathCompile (const xmlChar *str);
+XMLPUBFUN xmlXPathCompExprPtr XMLCALL
+ xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,
+ const xmlChar *str);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
+ xmlXPathContextPtr ctx);
+XMLPUBFUN int XMLCALL
+ xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
+ xmlXPathContextPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
+#endif /* LIBXML_XPATH_ENABLED */
+#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
+XMLPUBFUN void XMLCALL
+ xmlXPathInit (void);
+XMLPUBFUN int XMLCALL
+ xmlXPathIsNaN (double val);
+XMLPUBFUN int XMLCALL
+ xmlXPathIsInf (double val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/
+#endif /* ! __XML_XPATH_H__ */
--- /dev/null
+/*
+ * Summary: internal interfaces for XML Path Language implementation
+ * Description: internal interfaces for XML Path Language implementation
+ * used to build new modules on top of XPath like XPointer and
+ * XSLT
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XPATH_INTERNALS_H__
+#define __XML_XPATH_INTERNALS_H__
+
+#include <libxml/xmlversion.h>
+#include <libxml/xpath.h>
+
+#ifdef LIBXML_XPATH_ENABLED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/************************************************************************
+ * *
+ * Helpers *
+ * *
+ ************************************************************************/
+
+/*
+ * Many of these macros may later turn into functions. They
+ * shouldn't be used in #ifdef's preprocessor instructions.
+ */
+/**
+ * xmlXPathSetError:
+ * @ctxt: an XPath parser context
+ * @err: an xmlXPathError code
+ *
+ * Raises an error.
+ */
+#define xmlXPathSetError(ctxt, err) \
+ { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \
+ if ((ctxt) != NULL) (ctxt)->error = (err); }
+
+/**
+ * xmlXPathSetArityError:
+ * @ctxt: an XPath parser context
+ *
+ * Raises an XPATH_INVALID_ARITY error.
+ */
+#define xmlXPathSetArityError(ctxt) \
+ xmlXPathSetError((ctxt), XPATH_INVALID_ARITY)
+
+/**
+ * xmlXPathSetTypeError:
+ * @ctxt: an XPath parser context
+ *
+ * Raises an XPATH_INVALID_TYPE error.
+ */
+#define xmlXPathSetTypeError(ctxt) \
+ xmlXPathSetError((ctxt), XPATH_INVALID_TYPE)
+
+/**
+ * xmlXPathGetError:
+ * @ctxt: an XPath parser context
+ *
+ * Get the error code of an XPath context.
+ *
+ * Returns the context error.
+ */
+#define xmlXPathGetError(ctxt) ((ctxt)->error)
+
+/**
+ * xmlXPathCheckError:
+ * @ctxt: an XPath parser context
+ *
+ * Check if an XPath error was raised.
+ *
+ * Returns true if an error has been raised, false otherwise.
+ */
+#define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK)
+
+/**
+ * xmlXPathGetDocument:
+ * @ctxt: an XPath parser context
+ *
+ * Get the document of an XPath context.
+ *
+ * Returns the context document.
+ */
+#define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc)
+
+/**
+ * xmlXPathGetContextNode:
+ * @ctxt: an XPath parser context
+ *
+ * Get the context node of an XPath context.
+ *
+ * Returns the context node.
+ */
+#define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node)
+
+XMLPUBFUN int XMLCALL
+ xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN double XMLCALL
+ xmlXPathPopNumber (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathPopString (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void * XMLCALL
+ xmlXPathPopExternal (xmlXPathParserContextPtr ctxt);
+
+/**
+ * xmlXPathReturnBoolean:
+ * @ctxt: an XPath parser context
+ * @val: a boolean
+ *
+ * Pushes the boolean @val on the context stack.
+ */
+#define xmlXPathReturnBoolean(ctxt, val) \
+ valuePush((ctxt), xmlXPathNewBoolean(val))
+
+/**
+ * xmlXPathReturnTrue:
+ * @ctxt: an XPath parser context
+ *
+ * Pushes true on the context stack.
+ */
+#define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1)
+
+/**
+ * xmlXPathReturnFalse:
+ * @ctxt: an XPath parser context
+ *
+ * Pushes false on the context stack.
+ */
+#define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0)
+
+/**
+ * xmlXPathReturnNumber:
+ * @ctxt: an XPath parser context
+ * @val: a double
+ *
+ * Pushes the double @val on the context stack.
+ */
+#define xmlXPathReturnNumber(ctxt, val) \
+ valuePush((ctxt), xmlXPathNewFloat(val))
+
+/**
+ * xmlXPathReturnString:
+ * @ctxt: an XPath parser context
+ * @str: a string
+ *
+ * Pushes the string @str on the context stack.
+ */
+#define xmlXPathReturnString(ctxt, str) \
+ valuePush((ctxt), xmlXPathWrapString(str))
+
+/**
+ * xmlXPathReturnEmptyString:
+ * @ctxt: an XPath parser context
+ *
+ * Pushes an empty string on the stack.
+ */
+#define xmlXPathReturnEmptyString(ctxt) \
+ valuePush((ctxt), xmlXPathNewCString(""))
+
+/**
+ * xmlXPathReturnNodeSet:
+ * @ctxt: an XPath parser context
+ * @ns: a node-set
+ *
+ * Pushes the node-set @ns on the context stack.
+ */
+#define xmlXPathReturnNodeSet(ctxt, ns) \
+ valuePush((ctxt), xmlXPathWrapNodeSet(ns))
+
+/**
+ * xmlXPathReturnEmptyNodeSet:
+ * @ctxt: an XPath parser context
+ *
+ * Pushes an empty node-set on the context stack.
+ */
+#define xmlXPathReturnEmptyNodeSet(ctxt) \
+ valuePush((ctxt), xmlXPathNewNodeSet(NULL))
+
+/**
+ * xmlXPathReturnExternal:
+ * @ctxt: an XPath parser context
+ * @val: user data
+ *
+ * Pushes user data on the context stack.
+ */
+#define xmlXPathReturnExternal(ctxt, val) \
+ valuePush((ctxt), xmlXPathWrapExternal(val))
+
+/**
+ * xmlXPathStackIsNodeSet:
+ * @ctxt: an XPath parser context
+ *
+ * Check if the current value on the XPath stack is a node set or
+ * an XSLT value tree.
+ *
+ * Returns true if the current object on the stack is a node-set.
+ */
+#define xmlXPathStackIsNodeSet(ctxt) \
+ (((ctxt)->value != NULL) \
+ && (((ctxt)->value->type == XPATH_NODESET) \
+ || ((ctxt)->value->type == XPATH_XSLT_TREE)))
+
+/**
+ * xmlXPathStackIsExternal:
+ * @ctxt: an XPath parser context
+ *
+ * Checks if the current value on the XPath stack is an external
+ * object.
+ *
+ * Returns true if the current object on the stack is an external
+ * object.
+ */
+#define xmlXPathStackIsExternal(ctxt) \
+ ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS))
+
+/**
+ * xmlXPathEmptyNodeSet:
+ * @ns: a node-set
+ *
+ * Empties a node-set.
+ */
+#define xmlXPathEmptyNodeSet(ns) \
+ { while ((ns)->nodeNr > 0) (ns)->nodeTab[(ns)->nodeNr--] = NULL; }
+
+/**
+ * CHECK_ERROR:
+ *
+ * Macro to return from the function if an XPath error was detected.
+ */
+#define CHECK_ERROR \
+ if (ctxt->error != XPATH_EXPRESSION_OK) return
+
+/**
+ * CHECK_ERROR0:
+ *
+ * Macro to return 0 from the function if an XPath error was detected.
+ */
+#define CHECK_ERROR0 \
+ if (ctxt->error != XPATH_EXPRESSION_OK) return(0)
+
+/**
+ * XP_ERROR:
+ * @X: the error code
+ *
+ * Macro to raise an XPath error and return.
+ */
+#define XP_ERROR(X) \
+ { xmlXPathErr(ctxt, X); return; }
+
+/**
+ * XP_ERROR0:
+ * @X: the error code
+ *
+ * Macro to raise an XPath error and return 0.
+ */
+#define XP_ERROR0(X) \
+ { xmlXPathErr(ctxt, X); return(0); }
+
+/**
+ * CHECK_TYPE:
+ * @typeval: the XPath type
+ *
+ * Macro to check that the value on top of the XPath stack is of a given
+ * type.
+ */
+#define CHECK_TYPE(typeval) \
+ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
+ XP_ERROR(XPATH_INVALID_TYPE)
+
+/**
+ * CHECK_TYPE0:
+ * @typeval: the XPath type
+ *
+ * Macro to check that the value on top of the XPath stack is of a given
+ * type. Return(0) in case of failure
+ */
+#define CHECK_TYPE0(typeval) \
+ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
+ XP_ERROR0(XPATH_INVALID_TYPE)
+
+/**
+ * CHECK_ARITY:
+ * @x: the number of expected args
+ *
+ * Macro to check that the number of args passed to an XPath function matches.
+ */
+#define CHECK_ARITY(x) \
+ if (ctxt == NULL) return; \
+ if (nargs != (x)) \
+ XP_ERROR(XPATH_INVALID_ARITY); \
+ if (ctxt->valueNr < ctxt->valueFrame + (x)) \
+ XP_ERROR(XPATH_STACK_ERROR);
+
+/**
+ * CAST_TO_STRING:
+ *
+ * Macro to try to cast the value on the top of the XPath stack to a string.
+ */
+#define CAST_TO_STRING \
+ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \
+ xmlXPathStringFunction(ctxt, 1);
+
+/**
+ * CAST_TO_NUMBER:
+ *
+ * Macro to try to cast the value on the top of the XPath stack to a number.
+ */
+#define CAST_TO_NUMBER \
+ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \
+ xmlXPathNumberFunction(ctxt, 1);
+
+/**
+ * CAST_TO_BOOLEAN:
+ *
+ * Macro to try to cast the value on the top of the XPath stack to a boolean.
+ */
+#define CAST_TO_BOOLEAN \
+ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \
+ xmlXPathBooleanFunction(ctxt, 1);
+
+/*
+ * Variable Lookup forwarding.
+ */
+
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,
+ xmlXPathVariableLookupFunc f,
+ void *data);
+
+/*
+ * Function Lookup forwarding.
+ */
+
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
+ xmlXPathFuncLookupFunc f,
+ void *funcCtxt);
+
+/*
+ * Error reporting.
+ */
+XMLPUBFUN void XMLCALL
+ xmlXPatherror (xmlXPathParserContextPtr ctxt,
+ const char *file,
+ int line,
+ int no);
+
+XMLPUBFUN void XMLCALL
+ xmlXPathErr (xmlXPathParserContextPtr ctxt,
+ int error);
+
+#ifdef LIBXML_DEBUG_ENABLED
+XMLPUBFUN void XMLCALL
+ xmlXPathDebugDumpObject (FILE *output,
+ xmlXPathObjectPtr cur,
+ int depth);
+XMLPUBFUN void XMLCALL
+ xmlXPathDebugDumpCompExpr(FILE *output,
+ xmlXPathCompExprPtr comp,
+ int depth);
+#endif
+/**
+ * NodeSet handling.
+ */
+XMLPUBFUN int XMLCALL
+ xmlXPathNodeSetContains (xmlNodeSetPtr cur,
+ xmlNodePtr val);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathDifference (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathIntersection (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathDistinctSorted (xmlNodeSetPtr nodes);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathDistinct (xmlNodeSetPtr nodes);
+
+XMLPUBFUN int XMLCALL
+ xmlXPathHasSameNodes (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,
+ xmlNodePtr node);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathLeadingSorted (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeLeading (xmlNodeSetPtr nodes,
+ xmlNodePtr node);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathLeading (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,
+ xmlNodePtr node);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathTrailingSorted (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeTrailing (xmlNodeSetPtr nodes,
+ xmlNodePtr node);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathTrailing (xmlNodeSetPtr nodes1,
+ xmlNodeSetPtr nodes2);
+
+
+/**
+ * Extending a context.
+ */
+
+XMLPUBFUN int XMLCALL
+ xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix,
+ const xmlChar *ns_uri);
+XMLPUBFUN const xmlChar * XMLCALL
+ xmlXPathNsLookup (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix);
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);
+
+XMLPUBFUN int XMLCALL
+ xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ xmlXPathFunction f);
+XMLPUBFUN int XMLCALL
+ xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri,
+ xmlXPathFunction f);
+XMLPUBFUN int XMLCALL
+ xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ xmlXPathObjectPtr value);
+XMLPUBFUN int XMLCALL
+ xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri,
+ xmlXPathObjectPtr value);
+XMLPUBFUN xmlXPathFunction XMLCALL
+ xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
+ const xmlChar *name);
+XMLPUBFUN xmlXPathFunction XMLCALL
+ xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri);
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
+ const xmlChar *name);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
+ const xmlChar *name,
+ const xmlChar *ns_uri);
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);
+
+/**
+ * Utilities to extend XPath.
+ */
+XMLPUBFUN xmlXPathParserContextPtr XMLCALL
+ xmlXPathNewParserContext (const xmlChar *str,
+ xmlXPathContextPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);
+
+/* TODO: remap to xmlXPathValuePop and Push. */
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ valuePop (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN int XMLCALL
+ valuePush (xmlXPathParserContextPtr ctxt,
+ xmlXPathObjectPtr value);
+
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewString (const xmlChar *val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewCString (const char *val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathWrapString (xmlChar *val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathWrapCString (char * val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewFloat (double val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewBoolean (int val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewNodeSet (xmlNodePtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewValueTree (xmlNodePtr val);
+XMLPUBFUN int XMLCALL
+ xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
+ xmlNodePtr val);
+XMLPUBFUN int XMLCALL
+ xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,
+ xmlNodePtr val);
+XMLPUBFUN int XMLCALL
+ xmlXPathNodeSetAddNs (xmlNodeSetPtr cur,
+ xmlNodePtr node,
+ xmlNsPtr ns);
+XMLPUBFUN void XMLCALL
+ xmlXPathNodeSetSort (xmlNodeSetPtr set);
+
+XMLPUBFUN void XMLCALL
+ xmlXPathRoot (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL
+ xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathParseName (xmlXPathParserContextPtr ctxt);
+XMLPUBFUN xmlChar * XMLCALL
+ xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);
+
+/*
+ * Existing functions.
+ */
+XMLPUBFUN double XMLCALL
+ xmlXPathStringEvalNumber (const xmlChar *str);
+XMLPUBFUN int XMLCALL
+ xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt,
+ xmlXPathObjectPtr res);
+XMLPUBFUN void XMLCALL
+ xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt);
+XMLPUBFUN xmlNodeSetPtr XMLCALL
+ xmlXPathNodeSetMerge (xmlNodeSetPtr val1,
+ xmlNodeSetPtr val2);
+XMLPUBFUN void XMLCALL
+ xmlXPathNodeSetDel (xmlNodeSetPtr cur,
+ xmlNodePtr val);
+XMLPUBFUN void XMLCALL
+ xmlXPathNodeSetRemove (xmlNodeSetPtr cur,
+ int val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathNewNodeSetList (xmlNodeSetPtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathWrapNodeSet (xmlNodeSetPtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPathWrapExternal (void *val);
+
+XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN int XMLCALL xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN int XMLCALL xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);
+XMLPUBFUN void XMLCALL xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL xmlXPathAddValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL xmlXPathSubValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL xmlXPathMultValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL xmlXPathDivValues(xmlXPathParserContextPtr ctxt);
+XMLPUBFUN void XMLCALL xmlXPathModValues(xmlXPathParserContextPtr ctxt);
+
+XMLPUBFUN int XMLCALL xmlXPathIsNodeType(const xmlChar *name);
+
+/*
+ * Some of the axis navigation routines.
+ */
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextChild(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextParent(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,
+ xmlNodePtr cur);
+/*
+ * The official core of XPath functions.
+ */
+XMLPUBFUN void XMLCALL xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);
+XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);
+
+/**
+ * Really internal functions
+ */
+XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_XPATH_ENABLED */
+#endif /* ! __XML_XPATH_INTERNALS_H__ */
--- /dev/null
+/*
+ * Summary: API to handle XML Pointers
+ * Description: API to handle XML Pointers
+ * Base implementation was made accordingly to
+ * W3C Candidate Recommendation 7 June 2000
+ * http://www.w3.org/TR/2000/CR-xptr-20000607
+ *
+ * Added support for the element() scheme described in:
+ * W3C Proposed Recommendation 13 November 2002
+ * http://www.w3.org/TR/2002/PR-xptr-element-20021113/
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XPTR_H__
+#define __XML_XPTR_H__
+
+#include <libxml/xmlversion.h>
+
+#ifdef LIBXML_XPTR_ENABLED
+
+#include <libxml/tree.h>
+#include <libxml/xpath.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * A Location Set
+ */
+typedef struct _xmlLocationSet xmlLocationSet;
+typedef xmlLocationSet *xmlLocationSetPtr;
+struct _xmlLocationSet {
+ int locNr; /* number of locations in the set */
+ int locMax; /* size of the array as allocated */
+ xmlXPathObjectPtr *locTab;/* array of locations */
+};
+
+/*
+ * Handling of location sets.
+ */
+
+XMLPUBFUN xmlLocationSetPtr XMLCALL
+ xmlXPtrLocationSetCreate (xmlXPathObjectPtr val);
+XMLPUBFUN void XMLCALL
+ xmlXPtrFreeLocationSet (xmlLocationSetPtr obj);
+XMLPUBFUN xmlLocationSetPtr XMLCALL
+ xmlXPtrLocationSetMerge (xmlLocationSetPtr val1,
+ xmlLocationSetPtr val2);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRange (xmlNodePtr start,
+ int startindex,
+ xmlNodePtr end,
+ int endindex);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRangePoints (xmlXPathObjectPtr start,
+ xmlXPathObjectPtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRangeNodePoint (xmlNodePtr start,
+ xmlXPathObjectPtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRangePointNode (xmlXPathObjectPtr start,
+ xmlNodePtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRangeNodes (xmlNodePtr start,
+ xmlNodePtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewLocationSetNodes (xmlNodePtr start,
+ xmlNodePtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewRangeNodeObject (xmlNodePtr start,
+ xmlXPathObjectPtr end);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrNewCollapsedRange (xmlNodePtr start);
+XMLPUBFUN void XMLCALL
+ xmlXPtrLocationSetAdd (xmlLocationSetPtr cur,
+ xmlXPathObjectPtr val);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrWrapLocationSet (xmlLocationSetPtr val);
+XMLPUBFUN void XMLCALL
+ xmlXPtrLocationSetDel (xmlLocationSetPtr cur,
+ xmlXPathObjectPtr val);
+XMLPUBFUN void XMLCALL
+ xmlXPtrLocationSetRemove (xmlLocationSetPtr cur,
+ int val);
+
+/*
+ * Functions.
+ */
+XMLPUBFUN xmlXPathContextPtr XMLCALL
+ xmlXPtrNewContext (xmlDocPtr doc,
+ xmlNodePtr here,
+ xmlNodePtr origin);
+XMLPUBFUN xmlXPathObjectPtr XMLCALL
+ xmlXPtrEval (const xmlChar *str,
+ xmlXPathContextPtr ctx);
+XMLPUBFUN void XMLCALL
+ xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt,
+ int nargs);
+XMLPUBFUN xmlNodePtr XMLCALL
+ xmlXPtrBuildNodeList (xmlXPathObjectPtr obj);
+XMLPUBFUN void XMLCALL
+ xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LIBXML_XPTR_ENABLED */
+#endif /* __XML_XPTR_H__ */
--- /dev/null
+========================================================================\r
+ スタティック ライブラリ: libARIB プロジェクトの概要\r
+========================================================================\r
+\r
+この libARIB ライブラリ プロジェクトは、AppWizard により作成されました。\r
+\r
+ソース ファイルはプロジェクトの一部として作成されませんでした。\r
+\r
+\r
+libARIB.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+libARIB.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{B0C6D0F6-CAAE-45A3-8742-4568AE00EF8B}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>libARIB</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup />\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ <AdditionalOptions>\r
+ </AdditionalOptions>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\b25\aribstr.h" />\r
+ <ClInclude Include="..\src\b25\arib_std_b25.h" />\r
+ <ClInclude Include="..\src\b25\b_cas_card.h" />\r
+ <ClInclude Include="..\src\b25\portable.h" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\b25\aribstr.c" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="b25">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\b25\arib_std_b25.h">\r
+ <Filter>b25</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\b25\aribstr.h">\r
+ <Filter>b25</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\b25\b_cas_card.h">\r
+ <Filter>b25</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\b25\portable.h">\r
+ <Filter>b25</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\b25\aribstr.c">\r
+ <Filter>b25</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+========================================================================\r
+ スタティック ライブラリ: libPT1 プロジェクトの概要\r
+========================================================================\r
+\r
+この libPT1 ライブラリ プロジェクトは、AppWizard により作成されました。\r
+\r
+ソース ファイルはプロジェクトの一部として作成されませんでした。\r
+\r
+\r
+libPT1.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+libPT1.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{3479E7B7-A39D-4366-AE0E-18AFCD5521BD}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>libPT1</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <IncludePath>$(SolutionDir)/src/ry0/device/PT1/_Code/Prefix;$(SolutionDir)/src/ry0/device/PT1/_Code/PT;$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\device\PT1\PT1Core.cpp" />\r
+ <ClCompile Include="..\src\ry0\device\PT1\PT1Tuner.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\device\PT1\PT1Core.h" />\r
+ <ClInclude Include="..\src\ry0\device\PT1\PT1Tuner.h" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="ry0">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ <Filter Include="ry0\device">\r
+ <UniqueIdentifier>{86f1e857-ca7c-4e52-b4eb-42487b100b0a}</UniqueIdentifier>\r
+ </Filter>\r
+ <Filter Include="ry0\device\PT1">\r
+ <UniqueIdentifier>{fefcea89-249d-4f91-b388-5bbf05116254}</UniqueIdentifier>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\device\PT1\PT1Core.cpp">\r
+ <Filter>ry0\device\PT1</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\ry0\device\PT1\PT1Tuner.cpp">\r
+ <Filter>ry0\device\PT1</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\device\PT1\PT1Core.h">\r
+ <Filter>ry0\device\PT1</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\ry0\device\PT1\PT1Tuner.h">\r
+ <Filter>ry0\device\PT1</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+========================================================================\r
+ スタティック ライブラリ: libPT3 プロジェクトの概要\r
+========================================================================\r
+\r
+この libPT3 ライブラリ プロジェクトは、AppWizard により作成されました。\r
+\r
+ソース ファイルはプロジェクトの一部として作成されませんでした。\r
+\r
+\r
+libPT3.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+libPT3.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{76AE5E06-6231-4726-B972-BCCDC7281712}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>libPT3</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <IncludePath>$(SolutionDir)/src/ry0/device/PT3/_Code/OS;$(SolutionDir)/src/ry0/device/PT3/_Code/EX;$(SolutionDir)/src/ry0/device/PT3/_Code/Prefix;$(SolutionDir)/src/ry0/device/PT3/_API;$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\device\PT3\PT3Core.cpp" />\r
+ <ClCompile Include="..\src\ry0\device\PT3\PT3Tuner.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\device\PT3\PT3Core.h" />\r
+ <ClInclude Include="..\src\ry0\device\PT3\PT3Tuner.h" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="ry0">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ <Filter Include="ry0\device">\r
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+ <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+ </Filter>\r
+ <Filter Include="ry0\device\PT3">\r
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\ry0\device\PT3\PT3Core.cpp">\r
+ <Filter>ry0\device\PT3</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\ry0\device\PT3\PT3Tuner.cpp">\r
+ <Filter>ry0\device\PT3</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\ry0\device\PT3\PT3Core.h">\r
+ <Filter>ry0\device\PT3</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\ry0\device\PT3\PT3Tuner.h">\r
+ <Filter>ry0\device\PT3</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+========================================================================\r
+ スタティック ライブラリ: libRaym プロジェクトの概要\r
+========================================================================\r
+\r
+この libRaym ライブラリ プロジェクトは、AppWizard により作成されました。\r
+\r
+ソース ファイルはプロジェクトの一部として作成されませんでした。\r
+\r
+\r
+libRaym.vcxproj\r
+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。\r
+\r
+libRaym.vcxproj.filters\r
+ これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター ファイルです。このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する情報が含まれています。この関連付けは、特定のノードで同様の拡張子を持つファイルのグループ化を示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" フィルターに関連付けられています)。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+その他のメモ :\r
+\r
+AppWizard では "TODO:" コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース コードを示します。\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Debug|x64">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|x64">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>x64</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{2296E419-5E96-4B8C-879A-54DE855D1A39}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>libRaym</RootNamespace>\r
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+ <ConfigurationType>StaticLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <PlatformToolset>v140</PlatformToolset>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="Shared">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <IncludePath>$(SolutionDir)/lib/libxml/include/libxml2;$(SolutionDir)/src;$(IncludePath)</IncludePath>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <SDLCheck>true</SDLCheck>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\Raym\Application.cpp" />\r
+ <ClCompile Include="..\src\Raym\Array.cpp" />\r
+ <ClCompile Include="..\src\Raym\AutoreleasePool.cpp" />\r
+ <ClCompile Include="..\src\Raym\Bundle.cpp" />\r
+ <ClCompile Include="..\src\Raym\Data.cpp" />\r
+ <ClCompile Include="..\src\Raym\Date.cpp" />\r
+ <ClCompile Include="..\src\Raym\Dictionary.cpp" />\r
+ <ClCompile Include="..\src\Raym\FileHandle.cpp" />\r
+ <ClCompile Include="..\src\Raym\FileInputStream.cpp" />\r
+ <ClCompile Include="..\src\Raym\FileManager.cpp" />\r
+ <ClCompile Include="..\src\Raym\HTTPURLResponse.cpp" />\r
+ <ClCompile Include="..\src\Raym\InputStream.cpp" />\r
+ <ClCompile Include="..\src\Raym\Lock.cpp" />\r
+ <ClCompile Include="..\src\Raym\Log.cpp" />\r
+ <ClCompile Include="..\src\Raym\Number.cpp" />\r
+ <ClCompile Include="..\src\Raym\Object.cpp" />\r
+ <ClCompile Include="..\src\Raym\Pipe.cpp" />\r
+ <ClCompile Include="..\src\Raym\RunningApplication.cpp" />\r
+ <ClCompile Include="..\src\Raym\Service.cpp" />\r
+ <ClCompile Include="..\src\Raym\Stream.cpp" />\r
+ <ClCompile Include="..\src\Raym\String.cpp" />\r
+ <ClCompile Include="..\src\Raym\Task.cpp" />\r
+ <ClCompile Include="..\src\Raym\Timer.cpp" />\r
+ <ClCompile Include="..\src\Raym\URL.cpp" />\r
+ <ClCompile Include="..\src\Raym\URLConnection.cpp" />\r
+ <ClCompile Include="..\src\Raym\URLRequest.cpp" />\r
+ <ClCompile Include="..\src\Raym\URLResponse.cpp" />\r
+ <ClCompile Include="..\src\Raym\Workspace.cpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\Raym\Application.h" />\r
+ <ClInclude Include="..\src\Raym\Array.h" />\r
+ <ClInclude Include="..\src\Raym\AutoreleasePool.h" />\r
+ <ClInclude Include="..\src\Raym\Bundle.h" />\r
+ <ClInclude Include="..\src\Raym\Data.h" />\r
+ <ClInclude Include="..\src\Raym\Date.h" />\r
+ <ClInclude Include="..\src\Raym\Dictionary.h" />\r
+ <ClInclude Include="..\src\Raym\Error.h" />\r
+ <ClInclude Include="..\src\Raym\FileHandle.h" />\r
+ <ClInclude Include="..\src\Raym\FileInputStream.h" />\r
+ <ClInclude Include="..\src\Raym\FileManager.h" />\r
+ <ClInclude Include="..\src\Raym\HTTPURLResponse.h" />\r
+ <ClInclude Include="..\src\Raym\InputStream.h" />\r
+ <ClInclude Include="..\src\Raym\Lock.h" />\r
+ <ClInclude Include="..\src\Raym\Log.h" />\r
+ <ClInclude Include="..\src\Raym\Number.h" />\r
+ <ClInclude Include="..\src\Raym\Object.h" />\r
+ <ClInclude Include="..\src\Raym\Pipe.h" />\r
+ <ClInclude Include="..\src\Raym\Raym.h" />\r
+ <ClInclude Include="..\src\Raym\RunningApplication.h" />\r
+ <ClInclude Include="..\src\Raym\Runtime.h" />\r
+ <ClInclude Include="..\src\Raym\Service.h" />\r
+ <ClInclude Include="..\src\Raym\Stream.h" />\r
+ <ClInclude Include="..\src\Raym\String.h" />\r
+ <ClInclude Include="..\src\Raym\Task.h" />\r
+ <ClInclude Include="..\src\Raym\Timer.h" />\r
+ <ClInclude Include="..\src\Raym\URL.h" />\r
+ <ClInclude Include="..\src\Raym\URLConnection.h" />\r
+ <ClInclude Include="..\src\Raym\URLRequest.h" />\r
+ <ClInclude Include="..\src\Raym\URLResponse.h" />\r
+ <ClInclude Include="..\src\Raym\Workspace.h" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="リソース ファイル">\r
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+ </Filter>\r
+ <Filter Include="Raym">\r
+ <UniqueIdentifier>{0ed293f3-f22f-47fb-8c5b-5ec70fe7c85b}</UniqueIdentifier>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Text Include="ReadMe.txt" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\src\Raym\Application.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Array.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\AutoreleasePool.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Bundle.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Data.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Date.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Dictionary.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\FileHandle.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\FileInputStream.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\FileManager.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\HTTPURLResponse.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\InputStream.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Lock.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Log.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Number.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Object.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Pipe.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\RunningApplication.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Service.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Stream.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\String.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Task.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Timer.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\URL.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\URLConnection.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\URLRequest.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\URLResponse.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\src\Raym\Workspace.cpp">\r
+ <Filter>Raym</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\src\Raym\Application.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Array.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\AutoreleasePool.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Bundle.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Data.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Date.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Dictionary.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Error.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\FileHandle.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\FileInputStream.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\FileManager.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\HTTPURLResponse.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\InputStream.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Lock.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Log.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Number.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Object.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Pipe.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Raym.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\RunningApplication.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Runtime.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Service.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Stream.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\String.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Task.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Timer.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\URL.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\URLConnection.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\URLRequest.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\URLResponse.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\src\Raym\Workspace.h">\r
+ <Filter>Raym</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+//\r
+//\r
+//\r
+#include <stdio.h>\r
+\r
+#include <winsock2.h>\r
+\r
+#include <comdef.h>\r
+#include <taskschd.h>\r
+# pragma comment(lib, "taskschd.lib")\r
+# pragma comment(lib, "comsupp.lib")\r
+# pragma comment(lib, "credui.lib")\r
+\r
+#include <PowrProf.h>\r
+# pragma comment(lib, "PowrProf.lib")\r
+\r
+// #include "Resource.h" --\r
+#define IDS_APP_TITLE 103\r
+\r
+#define IDR_MAINFRAME 128\r
+#define IDD_IPTD_R1_DIALOG 102\r
+#define IDD_ABOUTBOX 103\r
+#define IDM_ABOUT 104\r
+#define IDM_EXIT 105\r
+#define IDI_IPTD_R1 107\r
+#define IDI_SMALL 108\r
+#define IDC_IPTD_R1 109\r
+#define IDC_MYICON 2\r
+#ifndef IDC_STATIC\r
+#define IDC_STATIC -1\r
+#endif\r
+// 新しいオブジェクトの次の既定値\r
+//\r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+\r
+#define _APS_NO_MFC 130\r
+#define _APS_NEXT_RESOURCE_VALUE 129\r
+#define _APS_NEXT_COMMAND_VALUE 32771\r
+#define _APS_NEXT_CONTROL_VALUE 1000\r
+#define _APS_NEXT_SYMED_VALUE 110\r
+#endif\r
+#endif\r
+// -- #include "Resource.h"\r
+\r
+#define DBG_LEBEL 3\r
+#include "Raym/Log.h"\r
+#include "Raym/Raym.h"\r
+#include "Raym/GlobalHook.h"\r
+\r
+LPCWSTR wakeTaskName_ = L"com.gmail.tim.and.pom.misc.PowerManager.WakeTask";\r
+\r
+#define WM_TRAYICONMESSAGE (WM_USER + 1)\r
+#define MAX_LOADSTRING 100\r
+#define IDLE_DETECT_COUNT 60\r
+\r
+ITaskService *createTaskService()\r
+{\r
+ // ------------------------------------------------------\r
+ // Initialize COM.\r
+ HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);\r
+ if (FAILED(hr))\r
+ {\r
+ printf("CoInitializeEx failed: %x\n", hr);\r
+ return NULL;\r
+ }\r
+/*\r
+ // Set general COM security levels.\r
+ hr = CoInitializeSecurity(NULL, -1, NULL, NULL,\r
+ RPC_C_AUTHN_LEVEL_PKT_PRIVACY,\r
+ RPC_C_IMP_LEVEL_IMPERSONATE,\r
+ NULL, 0, NULL);\r
+ if (FAILED(hr))\r
+ {\r
+ printf("CoInitializeSecurity failed: %x\n", hr);\r
+ CoUninitialize();\r
+ return NULL;\r
+ }\r
+*/\r
+ // ------------------------------------------------------\r
+ // Create an instance of the Task Service. \r
+ ITaskService *pService = NULL;\r
+ hr = CoCreateInstance(CLSID_TaskScheduler, NULL,\r
+ CLSCTX_INPROC_SERVER, IID_ITaskService,\r
+ (void**)&pService);\r
+ if (FAILED(hr))\r
+ {\r
+ printf("Failed to create an instance of ITaskService: %x\n", hr);\r
+ CoUninitialize();\r
+ return NULL;\r
+ }\r
+\r
+ // Connect to the task service.\r
+ hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());\r
+ if (FAILED(hr))\r
+ {\r
+ printf("ITaskService::Connect failed: %x\n", hr);\r
+ pService->Release();\r
+ CoUninitialize();\r
+ return NULL;\r
+ }\r
+ return pService;\r
+}\r
+\r
+namespace Raym\r
+{\r
+\r
+static Application *theApp_ = NULL;\r
+\r
+LRESULT CALLBACK __Application_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ if (theApp_ != NULL)\r
+ {\r
+ return theApp_->WndProc(hWnd, message, wParam, lParam);\r
+ }\r
+ return 0;\r
+}\r
+\r
+LRESULT CALLBACK KeyboardProc(int code, // フックコード\r
+ WPARAM wParam, // 仮想キーコード\r
+ LPARAM lParam) // キーストロークメッセージの情報\r
+{\r
+ if (theApp_ != NULL)\r
+ {\r
+ theApp_->resetCounter();\r
+ }\r
+ return 0;\r
+}\r
+\r
+LRESULT CALLBACK MouseProc(int code, // フックコード\r
+ WPARAM wParam, // メッセージ識別子\r
+ LPARAM lParam) // マウスの座標\r
+{\r
+ // マウス移動以外\r
+ if ((wParam != WM_MOUSEMOVE) && (theApp_ != NULL))\r
+ {\r
+ theApp_->resetCounter();\r
+ }\r
+ return 0;\r
+}\r
+\r
+Application::Application()\r
+{\r
+ DebugLog0("%s", __FUNCTION__);\r
+}\r
+\r
+Application::~Application()\r
+{\r
+ DebugLog0("%s", __FUNCTION__);\r
+}\r
+\r
+void InitializeMenuItem(HMENU hmenu, LPTSTR lpszItemName, int nId, HMENU hmenuSub)\r
+{\r
+ MENUITEMINFO mii;\r
+ \r
+ mii.cbSize = sizeof(MENUITEMINFO);\r
+ mii.fMask = MIIM_ID | MIIM_TYPE;\r
+ mii.wID = nId;\r
+\r
+ if (lpszItemName != NULL)\r
+ {\r
+ mii.fType = MFT_STRING;\r
+ mii.dwTypeData = lpszItemName;\r
+ }\r
+ else\r
+ {\r
+ mii.fType = MFT_SEPARATOR;\r
+ }\r
+\r
+ if (hmenuSub != NULL)\r
+ {\r
+ mii.fMask |= MIIM_SUBMENU;\r
+ mii.hSubMenu = hmenuSub;\r
+ }\r
+\r
+ InsertMenuItem(hmenu, nId, FALSE, &mii);\r
+}\r
+\r
+Application *Application::init(HINSTANCE hInstance, int nCmdShow, LPCWSTR className)\r
+{\r
+ if (theApp_ != NULL)\r
+ {\r
+ return NULL;\r
+ }\r
+\r
+ theApp_ = this;\r
+ _counter = 0;\r
+\r
+ TCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト\r
+ TCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名\r
+\r
+ LoadString(hInstance, IDC_IPTD_R1, szWindowClass, MAX_LOADSTRING);\r
+ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);\r
+\r
+ //\r
+ WNDCLASSEX wcex;\r
+\r
+ wcex.cbSize = sizeof(WNDCLASSEX);\r
+\r
+ wcex.style = CS_HREDRAW | CS_VREDRAW;\r
+ wcex.lpfnWndProc = __Application_WndProc;\r
+ wcex.cbClsExtra = 0;\r
+ wcex.cbWndExtra = 0;\r
+ wcex.hInstance = hInstance;\r
+ wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_IPTD_R1));\r
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);\r
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);\r
+ wcex.lpszMenuName = MAKEINTRESOURCE(IDC_IPTD_R1);\r
+ wcex.lpszClassName = szWindowClass;\r
+ wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));\r
+\r
+ RegisterClassEx(&wcex);\r
+\r
+ _instance = hInstance;\r
+\r
+ _wnd = CreateWindowEx(WS_EX_TRANSPARENT, // ex windows style\r
+ szWindowClass, // class name\r
+ szTitle, // window name\r
+ WS_OVERLAPPEDWINDOW, // window style\r
+ 0, // x positon\r
+ 0, // y position\r
+ CW_USEDEFAULT, // width\r
+ CW_USEDEFAULT, // height\r
+ HWND_DESKTOP, // parent handle\r
+ NULL, // menu handle\r
+ hInstance, // app handle\r
+ NULL); // windows data\r
+\r
+\r
+ if (!_wnd)\r
+ {\r
+ return NULL;\r
+ }\r
+\r
+ _menu = CreatePopupMenu();\r
+ InitializeMenuItem(_menu, TEXT("終了"), IDM_EXIT, NULL);\r
+\r
+ UpdateWindow(_wnd);\r
+\r
+ if (!addNotifyIcon())\r
+ {\r
+ DestroyWindow(_wnd);\r
+ return NULL;\r
+ }\r
+\r
+ // タイマ作成\r
+ _timer = SetTimer(_wnd, 1, 1000, NULL);\r
+ if (_timer == 0)\r
+ {\r
+ // 失敗\r
+ DestroyWindow(_wnd);\r
+ return NULL;\r
+ }\r
+\r
+ // グローバルフックを設定\r
+ if (!SetGlobalHook(WH_KEYBOARD, KeyboardProc))\r
+ {\r
+ // 失敗\r
+ KillTimer(_wnd, _timer);\r
+ DestroyWindow(_wnd);\r
+ return NULL;\r
+ }\r
+ if (!SetGlobalHook(WH_MOUSE, MouseProc))\r
+ {\r
+ // 失敗\r
+ SetGlobalHook(WH_KEYBOARD, NULL);\r
+ KillTimer(_wnd, _timer);\r
+ DestroyWindow(_wnd);\r
+ return NULL;\r
+ }\r
+\r
+ return this;\r
+}\r
+\r
+int Application::start()\r
+{\r
+ MSG msg;\r
+ HACCEL hAccelTable;\r
+ hAccelTable = LoadAccelerators(_instance, MAKEINTRESOURCE(IDC_IPTD_R1));\r
+\r
+ // メイン メッセージ ループ:\r
+ while (GetMessage(&msg, NULL, 0, 0))\r
+ {\r
+ if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))\r
+ {\r
+ TranslateMessage(&msg);\r
+ DispatchMessage(&msg);\r
+ }\r
+ }\r
+\r
+ SetGlobalHook(WH_MOUSE, NULL);\r
+ SetGlobalHook(WH_KEYBOARD, NULL);\r
+ KillTimer(_wnd, _timer);\r
+\r
+ return (int) msg.wParam;\r
+}\r
+\r
+LRESULT Application::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+ int wmId, wmEvent;\r
+ static UINT taskbar_created;\r
+ static BOOL idle_detected = false;\r
+\r
+ switch (message)\r
+ {\r
+ case WM_CREATE:\r
+ taskbar_created = RegisterWindowMessage(TEXT("TaskbarCreated"));\r
+ break;\r
+\r
+ case WM_TRAYICONMESSAGE:\r
+ switch (lParam)\r
+ {\r
+ case WM_LBUTTONDOWN:\r
+ break;\r
+ case WM_RBUTTONDOWN:\r
+ {\r
+ POINT pt;\r
+ GetCursorPos(&pt);\r
+ SetForegroundWindow(_wnd);\r
+ TrackPopupMenu(_menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, _wnd, NULL);\r
+ PostMessage(_wnd, WM_NULL, NULL, NULL);\r
+ }\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case WM_COMMAND:\r
+ wmId = LOWORD(wParam);\r
+ wmEvent = HIWORD(wParam);\r
+ // 選択されたメニューの解析:\r
+ switch (wmId)\r
+ {\r
+ case IDM_ABOUT:\r
+// DialogBox(_instance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);\r
+ break;\r
+ case IDM_EXIT:\r
+ if (canTerminate())\r
+ {\r
+ static bool flag = false;\r
+ if (!flag)\r
+ {\r
+ flag = true;\r
+ if (MessageBox(hWnd, TEXT("終了しますか?"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION) == IDYES)\r
+ {\r
+ deleteNotifyIcon();\r
+ DestroyWindow(_wnd);\r
+\r
+ DebugLog0("will terminate");\r
+ }\r
+ flag = false;\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ return DefWindowProc(hWnd, message, wParam, lParam);\r
+ }\r
+ break;\r
+\r
+ case WM_DESTROY:\r
+ deleteNotifyIcon();\r
+ PostQuitMessage(0);\r
+ break;\r
+\r
+ case WM_POWERBROADCAST:\r
+ switch (wParam)\r
+ {\r
+ case PBT_APMSUSPEND:\r
+ systemWillSuspend();\r
+ break;\r
+\r
+ case PBT_APMRESUMEAUTOMATIC:\r
+ systemResumed();\r
+ break;\r
+/*\r
+ case PBT_APMRESUMESUSPEND:\r
+ systemResumed();\r
+ break;\r
+*/\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case WM_TIMER:\r
+ if (idle_detected && (_counter == 0))\r
+ {\r
+ idle_detected = false;\r
+ detectNonIdle();\r
+ }\r
+ ++_counter;\r
+ if (_counter > IDLE_DETECT_COUNT)\r
+ {\r
+ idle_detected = true;\r
+ detectIdle();\r
+ _counter = 1;\r
+ }\r
+\r
+ // 念のためスリープ機能は抑止しておく\r
+ SetThreadExecutionState(ES_DISPLAY_REQUIRED);\r
+ break;\r
+\r
+ default:\r
+ if (message == taskbar_created)\r
+ {\r
+ addNotifyIcon();\r
+ }\r
+ break;\r
+ }\r
+\r
+ return DefWindowProc(hWnd, message, wParam, lParam);\r
+}\r
+\r
+void Application::resetCounter()\r
+{\r
+ _counter = 0;\r
+}\r
+\r
+void Application::sleep()\r
+{\r
+ _counter = 0;\r
+\r
+ SetSuspendState(FALSE, FALSE, FALSE);\r
+}\r
+\r
+void Application::suspend()\r
+{\r
+ _counter = 0;\r
+\r
+ HANDLE hToken; // アクセストークンのハンドル\r
+ LUID Luid; // LUID(ローカル・ユニークID)\r
+ TOKEN_PRIVILEGES OldPriv; // 特権トークン情報(変更前の特権)\r
+ TOKEN_PRIVILEGES NewPriv; // 特権トークン情報(新しい特権)\r
+ DWORD dwSize; // 特権トークン容量(変更前の特権)\r
+\r
+ // アクセストークンのハンドルを取得\r
+ if (OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hToken))\r
+ {\r
+ if ( LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&Luid) ){ // 特権名のLUIDを取得\r
+ NewPriv.PrivilegeCount = 1; // 特権数\r
+ NewPriv.Privileges[0].Luid = Luid; // 識別子\r
+ NewPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r
+ \r
+ // 特権トークン状態の有効/無効\r
+ if ( AdjustTokenPrivileges(hToken,FALSE,&NewPriv,sizeof(TOKEN_PRIVILEGES),&OldPriv,&dwSize) ){\r
+ if ( GetLastError() == ERROR_SUCCESS ){\r
+// bSuccess = TRUE;\r
+ }\r
+ }\r
+ }\r
+ CloseHandle( hToken );\r
+ }\r
+\r
+ SetSystemPowerState(FALSE, FALSE);\r
+}\r
+\r
+void Application::shutdown()\r
+{\r
+ _counter = 0;\r
+\r
+ system("shutdown /s");\r
+\r
+ deleteNotifyIcon();\r
+ DestroyWindow(_wnd);\r
+\r
+ DebugLog0("will terminate");\r
+}\r
+\r
+bool Application::addNotifyIcon()\r
+{\r
+ NOTIFYICONDATA nid;\r
+ ZeroMemory(&nid, sizeof(NOTIFYICONDATA));\r
+ nid.cbSize = sizeof(NOTIFYICONDATA);\r
+ nid.hWnd = _wnd;\r
+ nid.uID = 1;\r
+ nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;\r
+ LoadString(_instance, IDC_IPTD_R1, nid.szTip, MAX_LOADSTRING);\r
+ nid.uCallbackMessage = WM_TRAYICONMESSAGE;\r
+ nid.hIcon = LoadIcon(_instance, MAKEINTRESOURCE(IDI_IPTD_R1));\r
+\r
+ while (true)\r
+ {\r
+ if (Shell_NotifyIcon(NIM_ADD, &nid))\r
+ {\r
+ break;\r
+ }\r
+ if (GetLastError() != ERROR_TIMEOUT)\r
+ {\r
+ return false;\r
+ }\r
+ Sleep(1000);\r
+ if (Shell_NotifyIcon(NIM_MODIFY, &nid))\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+void Application::deleteNotifyIcon()\r
+{\r
+ NOTIFYICONDATA nid;\r
+ ZeroMemory(&nid, sizeof(NOTIFYICONDATA));\r
+\r
+ nid.cbSize = sizeof(NOTIFYICONDATA);\r
+ nid.hWnd = _wnd;\r
+ nid.uID = 0;\r
+ nid.uFlags = 0;\r
+\r
+ Shell_NotifyIcon(NIM_DELETE, &nid);\r
+}\r
+\r
+bool Application::setWakeSchedule(int year, int month, int day, int hour, int min)\r
+{\r
+// DebugLog2("PowerManager::setWakeSchedule()");\r
+\r
+ HRESULT hr;\r
+\r
+ // ------------------------------------------------------\r
+ // Create an instance of the Task Service. \r
+ ITaskService *pService = createTaskService();\r
+ if (pService == NULL)\r
+ {\r
+// DebugLog3("createTaskService() error.");\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ // ------------------------------------------------------\r
+ // Get the pointer to the root task folder. This folder will hold the\r
+ // new task that is registered.\r
+ ITaskFolder *pRootFolder = NULL;\r
+ hr = pService->GetFolder(_bstr_t( L"\\") , &pRootFolder);\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Cannot get Root folder pointer: %x", hr);\r
+ pService->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+ // Create the task definition object to create the task.\r
+ ITaskDefinition *pTask = NULL;\r
+ hr = pService->NewTask( 0, &pTask );\r
+\r
+ pService->Release(); // COM clean up. Pointer is no longer used.\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Failed to CoCreate an instance of the TaskService class: %x", hr);\r
+ pRootFolder->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+#if 0\r
+ // ------------------------------------------------------\r
+ // Get the registration info for setting the identification.\r
+ IRegistrationInfo *pRegInfo= NULL;\r
+ hr = pTask->get_RegistrationInfo( &pRegInfo );\r
+ if( FAILED(hr) )\r
+ {\r
+ printf("Cannot get identification pointer: %x\n", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ hr = pRegInfo->put_Author( L"Author Name" ); \r
+ pRegInfo->Release(); \r
+ if( FAILED(hr) )\r
+ {\r
+ printf("Cannot put identification info: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+#endif\r
+\r
+ // ------------------------------------------------------\r
+ // Create the principal for the task - these credentials\r
+ // are overwritten with the credentials passed to RegisterTaskDefinition\r
+ IPrincipal *pPrincipal = NULL;\r
+ hr = pTask->get_Principal( &pPrincipal );\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't get principal pointer: %x", hr);\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+ // Set up principal logon type to interactive logon\r
+ hr = pPrincipal->put_LogonType( TASK_LOGON_INTERACTIVE_TOKEN );\r
+ pPrincipal->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't put principal info: %x", hr);\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ } \r
+\r
+ // ------------------------------------------------------\r
+ // Create the settings for the task\r
+ ITaskSettings *pSettings = NULL;\r
+ hr = pTask->get_Settings( &pSettings );\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't get settings pointer: %x", hr);\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+ // Set setting values for the task. \r
+ hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE);\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't put setting information: %x", hr);\r
+ pSettings->Release();\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ hr = pSettings->put_WakeToRun(VARIANT_TRUE);\r
+ if( FAILED(hr) )\r
+ {\r
+ printf("\nCannot put setting information: %x", hr );\r
+ pSettings->Release();\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ // Set the idle settings for the task.\r
+ IIdleSettings *pIdleSettings = NULL;\r
+ hr = pSettings->get_IdleSettings( &pIdleSettings );\r
+ pSettings->Release();\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Can't get idle setting information: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ hr = pIdleSettings->put_WaitTimeout(L"PT5M");\r
+ pIdleSettings->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't put idle setting information: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+\r
+ // ------------------------------------------------------\r
+ // Get the trigger collection to insert the time trigger.\r
+ ITriggerCollection *pTriggerCollection = NULL;\r
+ hr = pTask->get_Triggers( &pTriggerCollection );\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't get trigger collection: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ // Add the time trigger to the task.\r
+ ITrigger *pTrigger = NULL; \r
+ hr = pTriggerCollection->Create( TASK_TRIGGER_TIME, &pTrigger ); \r
+ pTriggerCollection->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't create trigger: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ ITimeTrigger *pTimeTrigger = NULL;\r
+ hr = pTrigger->QueryInterface( \r
+ IID_ITimeTrigger, (void**) &pTimeTrigger );\r
+ pTrigger->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("QueryInterface call failed for ITimeTrigger: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ hr = pTimeTrigger->put_Id( _bstr_t( L"Trigger1" ) );\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Can't put trigger ID: %x", hr);\r
+ }\r
+\r
+ hr = pTimeTrigger->put_EndBoundary( _bstr_t(L"2034-05-02T08:00:00") );\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Can't put end boundary on trigger: %x", hr);\r
+ }\r
+\r
+ char tmpstr[32];\r
+ sprintf_s(tmpstr, "%04d-%02d-%02dT%02d:%02d:00", year, month, day, hour, min);\r
+// wstring aaaa = tmpstr;\r
+\r
+ // Set the task to start at a certain time. The time \r
+ // format should be YYYY-MM-DDTHH:MM:SS(+-)(timezone).\r
+ // For example, the start boundary below\r
+ // is January 1st 2005 at 12:05\r
+// hr = pTimeTrigger->put_StartBoundary( _bstr_t(L"2005-01-01T12:05:00") );\r
+ hr = pTimeTrigger->put_StartBoundary(_bstr_t(tmpstr));\r
+ pTimeTrigger->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't add start boundary to trigger: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+\r
+ // ------------------------------------------------------\r
+ // Add an action to the task. This task will execute notepad.exe. \r
+ IActionCollection *pActionCollection = NULL;\r
+\r
+ // Get the task action collection pointer.\r
+ hr = pTask->get_Actions( &pActionCollection );\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't get Task collection pointer: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+ // Create the action, specifying that it is an executable action.\r
+ IAction *pAction = NULL;\r
+ hr = pActionCollection->Create( TASK_ACTION_EXEC, &pAction );\r
+ pActionCollection->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can't create the action: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ IExecAction *pExecAction = NULL;\r
+ // QI for the executable task pointer.\r
+ hr = pAction->QueryInterface( \r
+ IID_IExecAction, (void**) &pExecAction );\r
+ pAction->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("QueryInterface call failed for IExecAction: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+\r
+ // Get the windows directory and set the path to notepad.exe.\r
+// wstring wstrExecutablePath = _wgetenv( L"WINDIR");\r
+// wstrExecutablePath += L"\\SYSTEM32\\WSCRIPT.EXE";\r
+\r
+ // Set the path of the executable to notepad.exe.\r
+// hr = pExecAction->put_Path( _bstr_t( wstrExecutablePath.c_str() ) );\r
+ hr = pExecAction->put_Path(_bstr_t(GetExecutePath()));\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Can't put action path: %x", hr );\r
+ pExecAction->Release();\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ } \r
+\r
+ // Set the path of the executable to notepad.exe.\r
+ hr = pExecAction->put_Arguments(_bstr_t(L"resume"));\r
+ pExecAction->Release();\r
+ if( FAILED(hr) )\r
+ {\r
+// DebugLog3("Can’t put action path: %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ } \r
+\r
+ // ------------------------------------------------------\r
+ // Save the task in the root folder.\r
+ IRegisteredTask *pRegisteredTask = NULL;\r
+ VARIANT varPassword;\r
+ varPassword.vt = VT_EMPTY;\r
+ hr = pRootFolder->RegisterTaskDefinition(_bstr_t(wakeTaskName_),\r
+ pTask,\r
+ TASK_CREATE_OR_UPDATE,\r
+ _variant_t(L""),\r
+// _variant_t(L"Network Service"),\r
+ varPassword,\r
+ TASK_LOGON_INTERACTIVE_TOKEN,\r
+ _variant_t(L""),\r
+ &pRegisteredTask);\r
+ if (FAILED(hr))\r
+ {\r
+// DebugLog3("Error saving the Task : %x", hr );\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ CoUninitialize();\r
+ return false;\r
+ }\r
+ \r
+ // Clean up.\r
+ pRootFolder->Release();\r
+ pTask->Release();\r
+ pRegisteredTask->Release();\r
+ CoUninitialize();\r
+\r
+ return true;\r
+}\r
+\r
+void Application::resetWakeSchedule()\r
+{\r
+ ITaskService *pService = createTaskService();\r
+ if (pService != NULL)\r
+ {\r
+ ITaskFolder *pRootFolder = NULL;\r
+ HRESULT hr = pService->GetFolder(_bstr_t( L"\\") , &pRootFolder);\r
+ if (!FAILED(hr))\r
+ {\r
+ pRootFolder->DeleteTask(_bstr_t(wakeTaskName_), 0);\r
+ pRootFolder->Release();\r
+ }\r
+ pService->Release();\r
+ CoUninitialize();\r
+ }\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Application::GetHomeDirectory(void)\r
+{\r
+ static char home_directory_[MAX_PATH + 1];\r
+\r
+ memset(home_directory_, 0x00, sizeof(home_directory_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ size_t len = GetEnvironmentVariable(L"USERPROFILE", strbuf, sizeof(strbuf));\r
+ if (len > 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, home_directory_, sizeof(home_directory_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return home_directory_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Application::GetExecutePath(void)\r
+{\r
+ static char execute_path_[MAX_PATH + 1];\r
+ memset(execute_path_, 0x00, sizeof(execute_path_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ if (GetModuleFileName(NULL, strbuf, MAX_PATH) != 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, execute_path_, sizeof(execute_path_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return execute_path_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Application::GetPublicDirectory(void)\r
+{\r
+ static char public_directory_[MAX_PATH + 1];\r
+\r
+ memset(public_directory_, 0x00, sizeof(public_directory_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ size_t len = GetEnvironmentVariable(L"PUBLIC", strbuf, sizeof(strbuf));\r
+ if (len > 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, public_directory_, sizeof(public_directory_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return public_directory_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+/*\r
+ * Win32 アプリケーションのエントリポイント\r
+ */\r
+int Application::main(Application *(*allocator)(), LPCWSTR className, HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)\r
+{\r
+ int result = -1;\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("");\r
+ DebugLog0("Application::main() global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ // ARP生成\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ // winsockの初期化\r
+ WSADATA wsaData;\r
+ WSAStartup(MAKEWORD(2,0), &wsaData);\r
+\r
+ // アプリケーションインスタンス生成\r
+ Application *app = allocator();\r
+ if (app != NULL)\r
+ {\r
+ // アプリケーション初期化\r
+ if (app->init(hInstance, nCmdShow, className))\r
+ {\r
+ // 実行\r
+ result = app->start();\r
+ }\r
+\r
+ // アプリケーションインスタンス解放\r
+ app->release();\r
+ }\r
+\r
+ // winsockのリソース解放\r
+ WSACleanup();\r
+\r
+ // ARP解放\r
+ pool->release();\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("Application::main() global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ return result;\r
+}\r
+\r
+\r
+} // Raym\r
+\r
--- /dev/null
+/**\r
+ * @file Application.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <Raym/Object.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Application : public Object\r
+{\r
+private:\r
+#ifdef _WIN32\r
+ HINSTANCE _instance; //\r
+ HWND _wnd; //\r
+ HMENU _menu;\r
+ UINT_PTR _timer;\r
+ UINT _counter;\r
+#endif\r
+\r
+ bool addNotifyIcon();\r
+ void deleteNotifyIcon();\r
+\r
+protected:\r
+ Application();\r
+ ~Application();\r
+\r
+public:\r
+ static Application *alloc();\r
+#ifdef _WIN32\r
+ virtual Application *init(HINSTANCE hInstance, int nCmdShow, LPCWSTR className);\r
+#endif\r
+ virtual int start();\r
+\r
+ virtual void systemWillSuspend() = 0;\r
+ virtual void systemResumed() = 0;\r
+ virtual void detectIdle() = 0;\r
+ virtual void detectNonIdle() = 0;\r
+ virtual bool canTerminate() = 0;\r
+\r
+ void resetCounter();\r
+ void sleep();\r
+ void suspend();\r
+ void shutdown();\r
+ bool setWakeSchedule(int year, int month, int day, int hour, int min);\r
+ void resetWakeSchedule();\r
+#ifdef _WIN32\r
+ LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
+#endif\r
+\r
+ // misc\r
+ static const char *GetHomeDirectory();\r
+ static const char *GetExecutePath();\r
+ static const char *GetPublicDirectory();\r
+\r
+#ifdef _WIN32\r
+ // Win32 アプリケーションのエントリポイント\r
+ static int main(Application *(*allocator)(), LPCWSTR className, HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);\r
+#endif\r
+};\r
+\r
+} // Raym\r
+\r
+#define ApplicationMain(APPCLASS, APPNAME, ...) Raym::Application::main((Raym::Application *(*)())APPCLASS::alloc, APPNAME, __VA_ARGS__)\r
--- /dev/null
+//\r
+// Array.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Array.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+Array::Array()\r
+{\r
+ DebugLog2("Array::Array()");\r
+\r
+ _array.clear();\r
+}\r
+\r
+Array::~Array()\r
+{\r
+ for (unsigned int i = 0; i < _array.size(); ++i)\r
+ {\r
+ Object *obj = _array.at(i);\r
+ obj->release();\r
+ }\r
+ _array.clear();\r
+\r
+ DebugLog2("Array::~Array()");\r
+}\r
+\r
+Array *Array::arrayWithCapacity(UInteger numItems)\r
+{\r
+ DebugLog2("Array::arrayWithCapacity(numItems)");\r
+\r
+ Array *result = Array::alloc()->initWithCapacity(numItems);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Array *Array::alloc()\r
+{\r
+ DebugLog2("Array::alloc()");\r
+\r
+ return new Array();\r
+}\r
+\r
+Array *Array::initWithCapacity(UInteger numItems)\r
+{\r
+ DebugLog2("Array::initWithCapacitiy(numItems)");\r
+\r
+ return this;\r
+}\r
+\r
+Array *Array::retain()\r
+{\r
+ DebugLog2("Array::retain()");\r
+\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+Array *Array::autorelease()\r
+{\r
+ DebugLog2("Array::autorelease()");\r
+\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+UInteger Array::count()\r
+{\r
+ DebugLog2("Array::count()");\r
+\r
+ UInteger result = 0;\r
+ RaymLock(this);\r
+ result = (UInteger)_array.size();\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+void Array::addObject(Object *object)\r
+{\r
+ DebugLog2("Array::addObject(object)");\r
+\r
+ if (object != NULL)\r
+ {\r
+ RaymLock(this);\r
+ object->retain();\r
+ _array.push_back(object);\r
+ RaymUnlock(this);\r
+ }\r
+}\r
+\r
+void Array::addObjectsFromArray(Array *array)\r
+{\r
+ DebugLog2("Array::addObjectsFromArray(array)");\r
+\r
+ if (array != NULL)\r
+ {\r
+ RaymLock(this);\r
+ for (UInteger i = 0; i < array->count(); ++i)\r
+ {\r
+ Object *object = array->objectAtIndex(i);\r
+ object->retain();\r
+ _array.push_back(object);\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+}\r
+\r
+Object *Array::objectAtIndex(UInteger index)\r
+{\r
+ DebugLog2("Array::objectAtIndex(index)");\r
+\r
+ Object *result = NULL;\r
+ RaymLock(this);\r
+ if (index < _array.size())\r
+ {\r
+ result = _array.at(index);\r
+ }\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+void Array::insertObject(Object *object, UInteger index)\r
+{\r
+ DebugLog2("Array::insertObject(object,index)");\r
+\r
+ RaymLock(this);\r
+ if (object != NULL)\r
+ {\r
+ std::vector<Object *>::iterator it;\r
+ UInteger idx = 0;\r
+ for (it = _array.begin(); it != _array.end(); ++it)\r
+ {\r
+ if (idx == index)\r
+ {\r
+ object->retain();\r
+ _array.insert(it, object);\r
+ break;\r
+ }\r
+ ++idx;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+}\r
+\r
+void Array::removeObject(Object *object)\r
+{\r
+ DebugLog2("Array::removeObject(object)");\r
+\r
+ RaymLock(this);\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _array.begin(); it != _array.end(); ++it)\r
+ {\r
+ if (*it == object)\r
+ {\r
+ (*it)->release();\r
+ _array.erase(it);\r
+ break;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+}\r
+\r
+void Array::removeObjectAtIndex(UInteger index)\r
+{\r
+ DebugLog2("Array::removeObjectAtIndex(index)");\r
+\r
+ RaymLock(this);\r
+ std::vector<Object *>::iterator it;\r
+ UInteger idx = 0;\r
+ for (it = _array.begin(); it != _array.end(); ++it)\r
+ {\r
+ if (idx == index)\r
+ {\r
+ (*it)->release();\r
+ _array.erase(it);\r
+ break;\r
+ }\r
+ ++idx;\r
+ }\r
+ RaymUnlock(this);\r
+}\r
+\r
+void Array::removeAllObjects()\r
+{\r
+ DebugLog2("Array::removeAllObjects()");\r
+\r
+ RaymLock(this);\r
+ for (unsigned int i = 0; i < _array.size(); ++i)\r
+ {\r
+ Object *obj = _array.at(i);\r
+ obj->release();\r
+ }\r
+ _array.clear();\r
+ RaymUnlock(this);\r
+}\r
+\r
+Array *Array::sortedArrayUsingFunction(Integer (*function)(Object *, Object *, void *), void *context)\r
+{\r
+ DebugLog2("Array::sortedArrayUsingFunction()");\r
+\r
+ Array *result = Array::arrayWithCapacity(0);\r
+\r
+ RaymLock(this);\r
+\r
+ for (unsigned int i = 0; i < _array.size(); ++i)\r
+ {\r
+ Object *obj = _array.at(i);\r
+ bool inserted = false;\r
+ if (result->count() > 0)\r
+ {\r
+ for (unsigned int j = 0; j < result->count(); ++j)\r
+ {\r
+ Object *obj2 = result->objectAtIndex(j);\r
+ if (function(obj, obj2, context) == OrderedAscending)\r
+ {\r
+ result->insertObject(obj, j);\r
+ inserted = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if (!inserted)\r
+ {\r
+ result->addObject(obj);\r
+ }\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+const char *Array::className()\r
+{\r
+ return "Array";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+// Array.h\r
+//\r
+\r
+#ifndef __RAYM_ARRAY_H__\r
+#define __RAYM_ARRAY_H__\r
+\r
+#include <vector>\r
+\r
+#include <Raym/Object.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Array : public Object\r
+{\r
+protected:\r
+ Array();\r
+ ~Array();\r
+\r
+ std::vector<Object *> _array;\r
+\r
+public:\r
+ //\r
+ static Array *arrayWithCapacity(UInteger numItems);\r
+ static Array *alloc();\r
+ Array *initWithCapacity(UInteger numItems);\r
+ Array *retain();\r
+ Array *autorelease();\r
+\r
+ UInteger count();\r
+ void addObject(Object *object);\r
+ void addObjectsFromArray(Array *array);\r
+ Object *objectAtIndex(UInteger index);\r
+\r
+ void insertObject(Object *object, UInteger index);\r
+\r
+ void removeObject(Object *object);\r
+ void removeObjectAtIndex(UInteger index);\r
+\r
+ void removeAllObjects();\r
+\r
+ Array *sortedArrayUsingFunction(Integer (*function)(Object *, Object *, void *), void *context);\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
+#endif // __RAYM_ARRAY_H__\r
--- /dev/null
+//
+// AutoreleasePool.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/AutoreleasePool.h>
+
+namespace Raym
+{
+
+DEFINE_STATIC_MUTEX(poolsLock_);
+typedef std::vector<AutoreleasePool *> PoolStack;
+#ifdef _WIN32
+typedef std::map<DWORD, PoolStack> PoolMap;
+#else
+typedef std::map<pthread_t, PoolStack> PoolMap;
+#endif
+static PoolMap pools_;
+static AutoreleasePool * rootPool_;
+
+AutoreleasePool::AutoreleasePool()
+{
+ DebugLog2("AutoreleasePool::AutoreleasePool()");
+}
+
+AutoreleasePool::~AutoreleasePool()
+{
+ poolsLock_.lock();
+
+#ifdef _WIN32
+ PoolMap::iterator it = pools_.find(GetCurrentThreadId());
+#else
+ PoolMap::iterator it = pools_.find(pthread_self());
+#endif
+ if (it != pools_.end())
+ {
+ AutoreleasePool *pool = (*it).second.back();
+ if (pool == this)
+ {
+ (*it).second.pop_back();
+ }
+ else
+ {
+ DebugLog0("Incorrect nesting of \'AutoreleasePool\'");
+// abort();
+ exit(0);
+ }
+ }
+ else
+ {
+ DebugLog0("\'AutoreleasePool\' is unavailable.");
+// abort();
+ exit(0);
+ }
+
+ poolsLock_.unlock();
+
+#if 0
+ std::vector<Object *>::iterator it2;
+ for (it2 = _objects.begin(); it2 != _objects.end(); ++it2)
+ {
+ (*it2)->release();
+ }
+ _objects.clear();
+#else
+ while (_objects.size() > 0)
+ {
+ _objects.back()->release();
+ _objects.pop_back();
+ }
+#endif
+
+ DebugLog2("AutoreleasePool::~AutoreleasePool()");
+}
+
+AutoreleasePool *AutoreleasePool::alloc()
+{
+ DebugLog2("AutoreleasePool::alloc()");
+
+ return new AutoreleasePool();
+}
+
+AutoreleasePool *AutoreleasePool::init()
+{
+ DebugLog2("AutoreleasePool::init()");
+
+ poolsLock_.lock();
+
+#ifdef _WIN32
+ PoolMap::iterator it = pools_.find(GetCurrentThreadId());
+#else
+ PoolMap::iterator it = pools_.find(pthread_self());
+#endif
+ if (it == pools_.end())
+ {
+ PoolStack stack;
+ stack.push_back(this);
+#ifdef _WIN32
+ pools_.insert(std::make_pair(GetCurrentThreadId(), stack));
+#else
+ pools_.insert(std::make_pair(pthread_self(), stack));
+#endif
+ }
+ else
+ {
+ (*it).second.push_back(this);
+ }
+
+ if (rootPool_ == NULL)
+ {
+ rootPool_ = this;
+ }
+
+ poolsLock_.unlock();
+
+ return this;
+}
+
+void AutoreleasePool::add(Object *object)
+{
+ DebugLog2("AutoreleasePool::add(object)");
+
+ if (object != NULL)
+ {
+ RaymLock(this);
+ _objects.push_back(object);
+ RaymUnlock(this);
+ }
+}
+
+void AutoreleasePool::addObject(Object *object, bool rootPool)
+{
+ DebugLog2("AutoreleasePool::addObject(object,rootPool)");
+
+ if (object != NULL)
+ {
+ poolsLock_.lock();
+
+ if (rootPool)
+ {
+ if (rootPool_ != NULL)
+ {
+ rootPool_->add(object);
+ }
+ else
+ {
+ DebugLog0("\'AutoreleasePool\' is unavailable.");
+// abort();
+ exit(0);
+ }
+ }
+ else
+ {
+#ifdef _WIN32
+ PoolMap::iterator it = pools_.find(GetCurrentThreadId());
+#else
+ PoolMap::iterator it = pools_.find(pthread_self());
+#endif
+ if (it != pools_.end())
+ {
+ (*it).second.back()->add(object);
+ }
+ else
+ {
+ DebugLog0("\'AutoreleasePool\' is unavailable.");
+// abort();
+ exit(0);
+ }
+ }
+
+ poolsLock_.unlock();
+ }
+}
+
+
+void AutoreleasePool::addObject(Object *object)
+{
+ DebugLog2("AutoreleasePool::addObject(object)");
+
+ addObject(object, false);
+}
+
+const char *AutoreleasePool::className()
+{
+ return "AutoreleasePool";
+}
+
+} // Raym
--- /dev/null
+//
+// AutoreleasePool.h
+//
+
+#ifndef __RAYM_AUTORELEASEPOOL_H__
+#define __RAYM_AUTORELEASEPOOL_H__
+
+#include <map>
+#include <vector>
+
+#include <Raym/Object.h>
+
+namespace Raym
+{
+
+class AutoreleasePool : public Object
+{
+protected:
+ AutoreleasePool();
+ ~AutoreleasePool();
+
+private:
+ void add(Object *object);
+ Object *autorelease();
+
+ std::vector<Object *> _objects;
+
+public:
+ //
+ static AutoreleasePool *alloc();
+
+ //
+ AutoreleasePool *init();
+
+ //
+ static void addObject(Object *object);
+ static void addObject(Object *object, bool rootPool);
+
+ virtual const char *className();
+};
+
+} // Raym
+
+#endif // __RAYM_AUTORELEASEPOOL_H__
--- /dev/null
+//\r
+// Bundle.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Bundle.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+DEFINE_STATIC_MUTEX(mutex_);\r
+static Bundle *mainBundle_ = NULL;\r
+\r
+Bundle::Bundle()\r
+{\r
+ DebugLog2("Bundle::Bundle()");\r
+\r
+ _path = NULL;\r
+ _localizedStrings = NULL;\r
+}\r
+\r
+Bundle::~Bundle()\r
+{\r
+ RELEASE(_path);\r
+ if (_path != NULL)\r
+ {\r
+ _path->release();\r
+ }\r
+ RELEASE(_localizedStrings);\r
+ if (_localizedStrings != NULL)\r
+ {\r
+ _localizedStrings->release();\r
+ }\r
+\r
+ DebugLog2("Bundle::~Bundle()");\r
+}\r
+\r
+Bundle *Bundle::alloc()\r
+{\r
+ DebugLog2("Bundle::alloc()");\r
+ return new Bundle();\r
+}\r
+\r
+Bundle *Bundle::mainBundle()\r
+{\r
+ DebugLog2("Bundle::mainBundle()");\r
+\r
+ mutex_.lock();\r
+\r
+ if (mainBundle_ == NULL)\r
+ {\r
+ String *path = NULL;\r
+#ifdef _WIN32\r
+ static char execute_path_[MAX_PATH + 1];\r
+ memset(execute_path_, 0x00, sizeof(execute_path_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ if (GetModuleFileName(NULL, strbuf, MAX_PATH) != 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, execute_path_, sizeof(execute_path_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ char drive[_MAX_DRIVE];\r
+ char dir[_MAX_DIR];\r
+\r
+ if (_splitpath_s(execute_path_, drive, sizeof(drive), dir, sizeof(dir), NULL, 0, NULL, 0) == 0)\r
+ {\r
+ path = String::stringWithFormat("%s%s", drive, dir);\r
+ }\r
+ }\r
+ }\r
+#else\r
+ // other platform\r
+#endif\r
+ if (path != NULL)\r
+ {\r
+ mainBundle_ = Bundle::alloc()->initWithPath(path);\r
+ ((Object *)mainBundle_)->autorelease(true);\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Bundle::mainBundle() abort.");\r
+ abort();\r
+ }\r
+ }\r
+ mutex_.unlock();\r
+\r
+ return mainBundle_;\r
+}\r
+\r
+Bundle *Bundle::initWithPath(String *path)\r
+{\r
+ DebugLog2("Bundle::initWithPath(path)");\r
+ DebugLog3("path: %s", path->cString());\r
+\r
+ RELEASE(_path);\r
+ if (_path != NULL)\r
+ {\r
+ _path->release();\r
+ _path = NULL;\r
+ }\r
+ _path = path->retain();\r
+\r
+ if (_localizedStrings != NULL)\r
+ {\r
+ _localizedStrings->release();\r
+ _localizedStrings = NULL;\r
+ }\r
+\r
+ _localizedStrings = Dictionary::alloc()->initWithContentsOfFile(_path->stringByAppendingPathComponent("Localizable.strings"));\r
+ if (_localizedStrings == NULL)\r
+ {\r
+ DebugLog3("_localizedStrings is NULL");\r
+ }\r
+\r
+ return this;\r
+}\r
+\r
+String *Bundle::localizedStringForKey(const char *key, const char *value, const char *tableName)\r
+{\r
+ DebugLog2("Bundle::localizedStringForKey(key,value,tableName)");\r
+\r
+ if ((key == NULL) && (value == NULL))\r
+ {\r
+ return NULL;\r
+ }\r
+\r
+ Dictionary *table = NULL;\r
+ if (tableName != NULL)\r
+ {\r
+\r
+ }\r
+ else\r
+ {\r
+ table = _localizedStrings;\r
+ }\r
+ if (table != NULL)\r
+ {\r
+ if (table->stringForKey(key) != NULL)\r
+ {\r
+ return table->stringForKey(key);\r
+ }\r
+ }\r
+ if (value != NULL)\r
+ {\r
+ return String::stringWithUTF8String(value);\r
+ }\r
+ return String::stringWithUTF8String(key);\r
+}\r
+\r
+const char *Bundle::className()\r
+{\r
+ return "Bundle";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+// Bundle.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/Dictionary.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Bundle : public Object\r
+{\r
+private:\r
+ String * _path;\r
+ Dictionary * _localizedStrings;\r
+\r
+protected:\r
+ Bundle();\r
+ ~Bundle();\r
+\r
+public:\r
+ static Bundle *alloc();\r
+ static Bundle *mainBundle();\r
+ Bundle *initWithPath(String *path);\r
+ Bundle *retain();\r
+ Bundle *autorelease();\r
+\r
+ String *localizedStringForKey(const char *key, const char *value, const char *tableName);\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//\r
+// Data.cpp\r
+//\r
+\r
+#ifdef _WIN32\r
+#include <io.h>\r
+#include <share.h>\r
+#endif\r
+#include <fcntl.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Data.h>\r
+#include <Raym/Error.h>\r
+#include <Raym/URLRequest.h>\r
+#include <Raym/URLResponse.h>\r
+#include <Raym/URLConnection.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+Data::Data()\r
+{\r
+ DebugLog2("Data::Data()");\r
+\r
+ _length = 0;\r
+ _bytes = NULL;\r
+}\r
+\r
+Data::~Data()\r
+{\r
+ if (_bytes != NULL)\r
+ {\r
+ free(_bytes);\r
+ }\r
+\r
+ DebugLog2("Data::~Data()");\r
+}\r
+\r
+Data *Data::alloc()\r
+{\r
+ DebugLog2("Data::alloc()");\r
+\r
+ return new Data();\r
+}\r
+\r
+Data *Data::initWithCapacity(UInteger aNumItems)\r
+{\r
+ DebugLog2("Data::initWithCapacity(aNumItems)");\r
+\r
+ return this;\r
+}\r
+\r
+Data *Data::initWithBytesAndLength(const void *bytes, UInteger length)\r
+{\r
+ DebugLog2("Data::initWithBytesAndLength(bytes,length)");\r
+\r
+ if (bytes != NULL)\r
+ {\r
+ void *ptr = malloc(length);\r
+ if (ptr != NULL)\r
+ {\r
+ _length = length;\r
+ _bytes = ptr;\r
+ memcpy(_bytes, bytes, length);\r
+ }\r
+ else\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ return this;\r
+}\r
+\r
+Data *Data::dataWithCapacity(UInteger aNumItems)\r
+{\r
+ DebugLog2("Data::dataWithCapacity(aNumItems)");\r
+\r
+ Data *result = Data::alloc()->initWithCapacity(aNumItems);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Data *Data::dataWithContentsOfFile(const char *path)\r
+{\r
+ DebugLog2("Data::dataWithContentsOfFile(path)");\r
+\r
+ Data *result = Data::alloc()->initWithContentsOfFile(path);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Data *Data::dataWithContentsOfURL(URL *url)\r
+{\r
+ DebugLog2("Data::dataWithContentsOfURL(url)");\r
+\r
+ Data *result = Data::alloc()->initWithContentsOfURL(url);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Data *Data::initWithContentsOfFile(String *path)\r
+{\r
+ DebugLog2("Data::initWithContentsOfFile(path)");\r
+\r
+ if (path != NULL)\r
+ {\r
+#ifdef _WIN32\r
+ struct __stat64 buffer;\r
+ if (_stat64(path->cString(), &buffer) == 0)\r
+ {\r
+ unsigned char *ptr = (unsigned char *)malloc(buffer.st_size);\r
+ if (ptr != NULL)\r
+ {\r
+ int fd = -1;\r
+ if (_sopen_s(&fd, path->cString(), _O_RDONLY | _O_BINARY, _SH_DENYNO, 0) == 0)\r
+ {\r
+/*\r
+ __int64 sum = 0;\r
+ while (sum < buffer.st_size)\r
+ {\r
+ int size = _read(fd, &ptr[sum], 256);\r
+ if (size < 0)\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): _read ng(%d). sum = %ld: %s", errno, sum, path->cString());\r
+ free(ptr);\r
+ release();\r
+ _close(fd);\r
+ return NULL;\r
+ }\r
+ sum += size;\r
+ if (sum >= buffer.st_size)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ if (sum != buffer.st_size)\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): buffer.st_size ng(%d).: %s", errno, path->cString());\r
+ free(ptr);\r
+ release();\r
+ _close(fd);\r
+ return NULL;\r
+ }\r
+*/\r
+ int size = _read(fd, ptr, (unsigned int)buffer.st_size);\r
+ if (size != buffer.st_size)\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): _read ng(%d). size = %ld: %s", errno, size, path->cString());\r
+ free(ptr);\r
+ release();\r
+ _close(fd);\r
+ return NULL;\r
+ }\r
+ _bytes = ptr;\r
+ _length = (UInteger)size;\r
+ _close(fd);\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): _sopen_s ng(%d).: %s", errno, path->cString());\r
+ free(ptr);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): mallog ng.");\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Data::initWithContentsOfFile(): stat ng.: %s", path->cString());\r
+ release();\r
+ return NULL;\r
+ }\r
+#else\r
+#endif\r
+ }\r
+ else\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+ return this;\r
+}\r
+\r
+Data *Data::initWithContentsOfFile(const char *path)\r
+{\r
+ DebugLog2("Data::initWithContentsOfFile(path)");\r
+\r
+ return initWithContentsOfFile(String::stringWithUTF8String(path));\r
+}\r
+\r
+Data *Data::initWithContentsOfURL(URL *url)\r
+{\r
+ DebugLog2("Data::initWithContentsOfURL(url)");\r
+\r
+ URLRequest *req = URLRequest::requestWithURL(url);\r
+ DebugLog2("nsdata: req: 0x%016x\n", req);\r
+ URLResponse *resp = NULL;\r
+ Error *error = NULL;\r
+ Data *data = URLConnection::sendSynchronousRequest(req, &resp, &error);\r
+ if (data != NULL)\r
+ {\r
+ DebugLog2("nsdata: data 0x%016x\n", data);\r
+ DebugLog2("nsdata: resp 0x%016x\n", resp);\r
+ return initWithBytesAndLength(data->bytes(), data->length());\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+Data *Data::retain()\r
+{\r
+ DebugLog2("Data::retain()");\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+Data *Data::autorelease()\r
+{\r
+ DebugLog2("Data::autorelease()");\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+UInteger Data::length()\r
+{\r
+ DebugLog2("Data::length()");\r
+\r
+ return _length;\r
+}\r
+\r
+const void *Data::bytes()\r
+{\r
+ DebugLog2("Data::bytes()");\r
+\r
+ return _bytes;\r
+}\r
+\r
+void Data::appendBytes(const void *bytes, UInteger length)\r
+{\r
+ DebugLog2("Data::appendBytes(bytes,length)");\r
+\r
+ if (bytes != NULL)\r
+ {\r
+ void *buf = realloc(_bytes, _length + length);\r
+ if (buf != NULL)\r
+ {\r
+ _bytes = buf;\r
+ memcpy(&((char *)_bytes)[_length], bytes, length);\r
+ _length += length;\r
+ }\r
+ }\r
+}\r
+\r
+const char *Data::className()\r
+{\r
+ return "Data";\r
+}\r
+\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+// Data.h\r
+//\r
+\r
+#ifndef __RAYM_DATA_H__\r
+#define __RAYM_DATA_H__\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/URL.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Data : public Object\r
+{\r
+private:\r
+ UInteger _length;\r
+ void * _bytes;\r
+\r
+protected:\r
+ Data();\r
+ ~Data();\r
+\r
+public:\r
+ static Data *alloc();\r
+ static Data *dataWithCapacity(UInteger aNumItems);\r
+ static Data *dataWithContentsOfFile(const char *path);\r
+ static Data *dataWithContentsOfURL(URL *url);\r
+\r
+ Data *initWithCapacity(UInteger aNumItems);\r
+ Data *initWithBytesAndLength(const void *bytes, UInteger length);\r
+ Data *initWithContentsOfFile(String *path);\r
+ Data *initWithContentsOfFile(const char *path);\r
+ Data *initWithContentsOfURL(URL *url);\r
+ Data *retain();\r
+ Data *autorelease();\r
+\r
+ UInteger length();\r
+ const void *bytes();\r
+\r
+ void appendBytes(const void *bytes, UInteger length);\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
+#endif // __RAYM_DATA_H__\r
--- /dev/null
+//
+// Date.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/Date.h>
+
+#ifdef _WIN32
+
+#if defined(_MSC_VER) || defined(_MSC_EXTEIO)
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
+#else
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
+#endif
+
+static int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ FILETIME ft;
+ unsigned __int64 tmpres = 0;
+ static int tzflag;
+
+ if (NULL != tv)
+ {
+ GetSystemTimeAsFileTime(&ft);
+
+ tmpres = ft.dwHighDateTime;
+ tmpres <<= 32;
+ tmpres |= ft.dwLowDateTime;
+
+ /*converting file time to unix epoch*/
+ tmpres /= 10; /*convert into microseconds*/
+ tmpres -= DELTA_EPOCH_IN_MICROSECS;
+ tv->tv_sec = (long)(tmpres / 1000000UL);
+ tv->tv_usec = (long)(tmpres % 1000000UL);
+ }
+
+ if (NULL != tz)
+ {
+/*
+ if (!tzflag)
+ {
+ _tzset();
+ tzflag++;
+ }
+ tz->tz_minuteswest = _get_timezone / 60;
+ tz->tz_dsttime = _daylight;
+*/
+ }
+
+ return 0;
+}
+
+#endif // _WIN32
+
+namespace Raym
+{
+
+Date::Date()
+{
+ DebugLog2("Date::Date()");
+
+ _time.tv_sec = 0;
+ _time.tv_usec = 0;
+ _zone.tz_minuteswest = 0;
+ _zone.tz_dsttime = 0;
+}
+
+Date::~Date()
+{
+ _time.tv_sec = 0;
+ _time.tv_usec = 0;
+ _zone.tz_minuteswest = 0;
+ _zone.tz_dsttime = 0;
+
+ DebugLog2("Date::~Date()");
+}
+
+Date *Date::alloc()
+{
+ DebugLog2("Date::alloc()");
+
+ return new Date();
+}
+
+Date *Date::date()
+{
+ DebugLog2("Date::date()");
+
+ Date *result = NULL;
+ result = Date::alloc()->init();
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ return result;
+}
+
+Date *Date::dateWithTimeIntervalSinceNow(TimeInterval seconds)
+{
+ DebugLog2("Date::dateWithTimeIntervalSinceNow(seconds)");
+
+ Date *result = NULL;
+ result = Date::alloc()->initWithTimeIntervalSinceNow(seconds);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ return result;
+}
+
+Date *Date::init()
+{
+ DebugLog2("Date::init()");
+
+ if (gettimeofday(&_time, &_zone) != 0)
+ {
+ return NULL;
+ }
+ return this;
+}
+
+Date *Date::initWithTimeInterval(TimeInterval seconds, Date *refDate)
+{
+ DebugLog2("Date::initWithTimeInterval(seconds,refDate)");
+
+ if (refDate == NULL)
+ {
+ return NULL;
+ }
+
+ _time = refDate->_time;
+ _zone = refDate->_zone;
+
+ _time.tv_sec += (int)seconds;
+ _time.tv_usec += ((int)(seconds * 1000000)) % 1000000;
+ if (_time.tv_usec >= 1000000)
+ {
+ _time.tv_sec += 1;
+ _time.tv_usec -= 1000000;
+ }
+
+ return this;
+}
+
+Date *Date::initWithTimeIntervalSinceNow(TimeInterval seconds)
+{
+ DebugLog2("Date::initWithTimeIntervalSinceNow(seconds)");
+
+ if (gettimeofday(&_time, &_zone) != 0)
+ {
+ return NULL;
+ }
+
+ _time.tv_sec += (int)seconds;
+ _time.tv_usec += ((int)(seconds * 1000000)) % 1000000;
+ if (_time.tv_usec >= 1000000)
+ {
+ _time.tv_sec += 1;
+ _time.tv_usec -= 1000000;
+ }
+
+ return this;
+}
+
+TimeInterval Date::timeIntervalSinceDate(Date *anotherDate)
+{
+ DebugLog2("Date::timeIntervalSinceDate(anotherDate)");
+
+ if (anotherDate == NULL)
+ {
+ abort();
+ }
+
+ TimeInterval self, another;
+ self = _time.tv_usec;
+ self = _time.tv_sec + self / 1000000;
+ another = anotherDate->_time.tv_usec;
+ another = anotherDate->_time.tv_sec + another / 1000000;
+
+ return self - another;
+}
+
+Date *Date::dateByAddingTimeInterval(TimeInterval seconds)
+{
+ DebugLog2("Date::dateByAddingTimeInterval(seconds)");
+
+ Date *result = Date::alloc()->initWithTimeInterval(seconds, this);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ return result;
+}
+
+ComparisonResult Date::compare(Date *anotherDate)
+{
+ DebugLog2("Date::compare(anotherDate)");
+
+ if (!anotherDate)
+ {
+ abort();
+ }
+ if ((_time.tv_sec < anotherDate->_time.tv_sec) ||
+ ((_time.tv_sec == anotherDate->_time.tv_sec) && (_time.tv_usec < anotherDate->_time.tv_usec)))
+ {
+ return OrderedAscending;
+ }
+ if ((_time.tv_sec == anotherDate->_time.tv_sec) && (_time.tv_usec == anotherDate->_time.tv_usec))
+ {
+ return OrderedSame;
+ }
+ return OrderedDescending;
+}
+
+const char *Date::className()
+{
+ return "Date";
+}
+
+} // Raym
--- /dev/null
+//
+// Date.h
+//
+
+#pragma once
+
+#ifdef _WIN32
+#include <winsock.h>
+
+struct timezone
+{
+ int tz_minuteswest; /* minutes W of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+int gettimeofday(struct timeval *tv, struct timezone *tz);
+
+#else
+#include <sys/time.h>
+#endif
+
+#include <Raym/Object.h>
+
+namespace Raym
+{
+
+typedef double TimeInterval;
+
+class Date : public Object
+{
+private:
+ struct timeval _time;
+ struct timezone _zone;
+
+protected:
+ Date();
+ ~Date();
+
+public:
+ static Date *alloc();
+ static Date *date();
+ static Date *dateWithTimeIntervalSinceNow(TimeInterval seconds);
+
+ Date *init();
+ Date *initWithTimeInterval(TimeInterval seconds, Date *refDate);
+ Date *initWithTimeIntervalSinceNow(TimeInterval seconds);
+
+ Date *dateByAddingTimeInterval(TimeInterval seconds);
+
+ TimeInterval timeIntervalSinceDate(Date *anotherDate);
+ ComparisonResult compare(Date *anotherDate);
+
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//\r
+// Dictionary.cpp\r
+//\r
+\r
+#include <fcntl.h>\r
+#include <sys/stat.h>\r
+#ifdef _WIN32\r
+#include <io.h>\r
+#include <share.h>\r
+#else\r
+#include <unistd.h>\r
+#endif\r
+#include <libxml/xmlreader.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Dictionary.h>\r
+\r
+/*\r
+#define RELEASE(P1) \\r
+ if ((P1) != NULL) \\r
+ { \\r
+ (P1)->release(); \\r
+ (P1) = NULL; \\r
+ }\r
+*/\r
+namespace Raym\r
+{\r
+\r
+Dictionary::Dictionary()\r
+{\r
+ DebugLog2("Dictionary::Dictionary()");\r
+\r
+ _dict.clear();\r
+}\r
+\r
+Dictionary::~Dictionary()\r
+{\r
+ for (unsigned int i = 0; i < _dict.size(); ++i)\r
+ {\r
+ Object *obj = _dict.at(i);\r
+ obj->release();\r
+ }\r
+ _dict.clear();\r
+\r
+ DebugLog2("Dictionary::~Dictionary()");\r
+}\r
+\r
+Dictionary *Dictionary::dictionaryWithCapacity(UInteger numItems)\r
+{\r
+ DebugLog2("Dictionary::dictionaryWithCapacity(numItems)");\r
+\r
+ Dictionary *result = Dictionary::alloc()->initWithCapacity(numItems);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Dictionary *Dictionary::dictionaryWithDictionary(Dictionary *dictionary)\r
+{\r
+ DebugLog2("Dictionary::dictionaryWithDictionary(dictionary)");\r
+\r
+ Dictionary *result = Dictionary::alloc()->initWithDictionary(dictionary);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+Dictionary *Dictionary::alloc()\r
+{\r
+ DebugLog2("Dictionary::alloc()");\r
+\r
+ return new Dictionary();\r
+}\r
+\r
+Dictionary *Dictionary::initWithCapacity(UInteger numItems)\r
+{\r
+ DebugLog2("Dictionary::initWithCapacity(numItems)");\r
+\r
+ return this;\r
+}\r
+\r
+Dictionary *Dictionary::initWithDictionary(Dictionary *dictionary)\r
+{\r
+ DebugLog2("Dictionary::initWithDictionary(dictionary)");\r
+\r
+ if (dictionary != NULL)\r
+ {\r
+ for (unsigned int i = 0; i < _dict.size(); ++i)\r
+ {\r
+ _dict.at(i)->release();\r
+ }\r
+ _dict.clear();\r
+ _dict = dictionary->_dict;\r
+ for (unsigned int i = 0; i < _dict.size(); ++i)\r
+ {\r
+ _dict.at(i)->retain();\r
+ }\r
+ return this;\r
+ }\r
+\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+static String *parseKey(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parseKey(reader)");\r
+\r
+ String *result = NULL;\r
+ if ((strcmp("key", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT)\r
+ {\r
+ const char *value = (const char *)xmlTextReaderConstValue(reader);\r
+ if (value != NULL)\r
+ {\r
+ DebugLog3("key: %s\n", value);\r
+ result = String::alloc()->initWithCString(value, UTF8StringEncoding);\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ if ((strcmp("key", (const char *)xmlTextReaderConstName(reader)) == 0) &&\r
+ (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT))\r
+ {\r
+ return result;\r
+ }\r
+ }\r
+ RELEASE(result);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+static Object *parseString(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parseString(reader)");\r
+\r
+ String *result = NULL;\r
+ if ((strcmp("string", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ int type = xmlTextReaderNodeType(reader);\r
+ if ((type == XML_READER_TYPE_TEXT) || (type == XML_READER_TYPE_SIGNIFICANT_WHITESPACE))\r
+ {\r
+ const char *value = (const char *)xmlTextReaderConstValue(reader);\r
+ if (value != NULL)\r
+ {\r
+ result = String::alloc()->initWithCString(value, UTF8StringEncoding);\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ if ((strcmp("string", (const char *)xmlTextReaderConstName(reader)) == 0) &&\r
+ (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT))\r
+ {\r
+ return result;\r
+ }\r
+ }\r
+ RELEASE(result);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+static Object *parseInteger(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parseInteger(reader)\n");\r
+\r
+ Number *result = NULL;\r
+ if ((strcmp("integer", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT)\r
+ {\r
+ const char *value = (const char *)xmlTextReaderConstValue(reader);\r
+ if (value != NULL)\r
+ {\r
+ int val = atoi(value);\r
+ char tmp[32];\r
+#ifdef _WIN32\r
+ sprintf_s(tmp, 32, "%d", val);\r
+#else\r
+ sprintf(tmp, "%d", val);\r
+#endif\r
+ if (strcmp(tmp, value) != 0)\r
+ {\r
+ DebugLog0("convert error\n");\r
+ abort();\r
+ }\r
+ result = Number::alloc()->initWithInt(val);\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ if ((strcmp("integer", (const char *)xmlTextReaderConstName(reader)) == 0) &&\r
+ (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT))\r
+ {\r
+ return result;\r
+ }\r
+ }\r
+ RELEASE(result);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+static Dictionary *parseDict(xmlTextReaderPtr reader);\r
+\r
+static Array *parseArray(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parseArray(reader)");\r
+\r
+ Array *result = NULL;\r
+ if ((strcmp("array", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ result = Array::alloc()->initWithCapacity(0);\r
+ Object *value = NULL;\r
+ int baseDepth = xmlTextReaderDepth(reader);\r
+ while (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ const char *name = (const char *)xmlTextReaderConstName(reader);\r
+ int type = xmlTextReaderNodeType(reader);\r
+ int depth = xmlTextReaderDepth(reader);\r
+ if (type == XML_READER_TYPE_ELEMENT)\r
+ {\r
+ if (baseDepth + 1 == depth)\r
+ {\r
+ if (strcmp("integer", name) == 0)\r
+ {\r
+ value = parseInteger(reader);\r
+ }\r
+ else if (strcmp("string", name) == 0)\r
+ {\r
+ value = parseString(reader);\r
+ }\r
+ else if (strcmp("array", name) == 0)\r
+ {\r
+ value = parseArray(reader);\r
+ }\r
+ else if (strcmp("dict", name) == 0)\r
+ {\r
+ value = parseDict(reader);\r
+ }\r
+ else if (strcmp("true", name) == 0)\r
+ {\r
+ value = Number::alloc()->initWithBool(true);\r
+ }\r
+ else if (strcmp("false", name) == 0)\r
+ {\r
+ value = Number::alloc()->initWithBool(false);\r
+ }\r
+ else\r
+ {\r
+ // unknown tag\r
+ DebugLog0("format error: unknown tag: %s\n", name);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ if (value == NULL)\r
+ {\r
+ DebugLog0("format error: parse NG.(%s)\n", name);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ result->addObject(value);\r
+ RELEASE(value);\r
+ }\r
+ }\r
+ else if (type == XML_READER_TYPE_END_ELEMENT)\r
+ {\r
+ if ((baseDepth == depth) && (strcmp("array", name) == 0))\r
+ {\r
+ break;\r
+ }\r
+ DebugLog0("format error: desuka?\n");\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ }\r
+ RELEASE(value);\r
+ }\r
+ return result;\r
+}\r
+\r
+static Dictionary *parseDict(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parseDict(reader)");\r
+\r
+ Dictionary *result = NULL;\r
+ if ((strcmp("dict", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ result = Dictionary::alloc()->initWithCapacity(0);\r
+ String *key = NULL;\r
+ Object *value = NULL;\r
+ int baseDepth = xmlTextReaderDepth(reader);\r
+ while (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ const char *name = (const char *)xmlTextReaderConstName(reader);\r
+ int type = xmlTextReaderNodeType(reader);\r
+ int depth = xmlTextReaderDepth(reader);\r
+ if (type == XML_READER_TYPE_ELEMENT)\r
+ {\r
+ if (baseDepth + 1 == depth)\r
+ {\r
+ if (strcmp("key", name) == 0)\r
+ {\r
+ RELEASE(key);\r
+ key = parseKey(reader);\r
+ }\r
+ else if (strcmp("integer", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = parseInteger(reader);\r
+ }\r
+ else if (strcmp("string", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = parseString(reader);\r
+ }\r
+ else if (strcmp("array", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = parseArray(reader);\r
+ }\r
+ else if (strcmp("dict", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = parseDict(reader);\r
+ }\r
+ else if (strcmp("true", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = Number::alloc()->initWithBool(true);\r
+ }\r
+ else if (strcmp("false", name) == 0)\r
+ {\r
+ RELEASE(value);\r
+ value = Number::alloc()->initWithBool(false);\r
+ }\r
+ else\r
+ {\r
+ // unknown tag\r
+ DebugLog0("format error: unknown tag: %s\n", name);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ if ((key != NULL) && (value != NULL))\r
+ {\r
+ result->setObject(value, key);\r
+ RELEASE(key);\r
+ RELEASE(value);\r
+ }\r
+ }\r
+ }\r
+ else if (type == XML_READER_TYPE_END_ELEMENT)\r
+ {\r
+ if ((baseDepth == depth) && (strcmp("dict", name) == 0))\r
+ {\r
+ break;\r
+ }\r
+ DebugLog0("format error: %s(): %s\n", __FUNCTION__, name);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ }\r
+ RELEASE(key);\r
+ RELEASE(value);\r
+ }\r
+ return result;\r
+}\r
+\r
+static Dictionary *parsePlist(xmlTextReaderPtr reader)\r
+{\r
+ DebugLog2("parsePlist(reader)");\r
+\r
+ Dictionary *result = NULL;\r
+ if ((strcmp("plist", (const char *)xmlTextReaderConstName(reader)) == 0) && (xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT))\r
+ {\r
+ int baseDepth = xmlTextReaderDepth(reader);\r
+ DebugLog3("baseDepth = %d\n", baseDepth);\r
+ while (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ const char *name = (const char *)xmlTextReaderConstName(reader);\r
+ int type = xmlTextReaderNodeType(reader);\r
+ int depth = xmlTextReaderDepth(reader);\r
+ if (type == XML_READER_TYPE_ELEMENT)\r
+ {\r
+ if (baseDepth + 1 == depth)\r
+ {\r
+ if (strcmp("dict", name) == 0)\r
+ {\r
+ result = parseDict(reader);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("format error: %s(): name:%s\n", __FUNCTION__, name);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ }\r
+ else if (type == XML_READER_TYPE_END_ELEMENT)\r
+ {\r
+ if ((baseDepth == depth) && (strcmp("plist", name) == 0))\r
+ {\r
+ break;\r
+ }\r
+ DebugLog0("format error: %s(): name:%s, depth:%d\n", __FUNCTION__, name, depth);\r
+ RELEASE(result);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+Dictionary *Dictionary::initWithContentsOfFile(const char *path)\r
+{\r
+ DebugLog2("Dictionary::initWithContentsOfFile(path)");\r
+\r
+ return initWithContentsOfFile(String::alloc()->initWithUTF8String(path)->autorelease());\r
+}\r
+\r
+Dictionary *Dictionary::initWithContentsOfFile(String *path)\r
+{\r
+ DebugLog2("Dictionary::initWithContentsOfFile(path)");\r
+\r
+ bool success = false;\r
+ xmlTextReaderPtr reader = xmlReaderForFile(path->cString(), NULL, 0);\r
+ if (reader != NULL)\r
+ {\r
+ if (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ const char *enc = (const char *)xmlTextReaderConstEncoding(reader);\r
+ DebugLog2("encoding: %s\n", enc);\r
+ if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_DOCUMENT_TYPE)\r
+ {\r
+ while (xmlTextReaderRead(reader) == 1)\r
+ {\r
+ const char *name = (const char *)xmlTextReaderConstName(reader);\r
+ int type = xmlTextReaderNodeType(reader);\r
+ if (type == XML_READER_TYPE_ELEMENT)\r
+ {\r
+ if (strcmp("plist", name) == 0)\r
+ {\r
+ Dictionary *d = parsePlist(reader);\r
+ if (d != NULL)\r
+ {\r
+ // copy\r
+ if (initWithDictionary(d) != NULL)\r
+ {\r
+ success = true;\r
+ }\r
+ d->release();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Dictionary::initWithContentsOfFile(\"%s\") has error.", path->cString());\r
+ }\r
+ }\r
+ else if (type == XML_READER_TYPE_END_ELEMENT)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ xmlTextReaderClose(reader);\r
+ }\r
+\r
+ if (success)\r
+ {\r
+ return this;\r
+ }\r
+\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+Dictionary *Dictionary::retain()\r
+{\r
+ DebugLog2("Dictionary::retain()");\r
+\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+Dictionary *Dictionary::autorelease()\r
+{\r
+ DebugLog2("Dictionary::autorelease()");\r
+\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+void Dictionary::setObject(Object *object, String *forKey)\r
+{\r
+ DebugLog2("Dictionary::setObject(object,key)");\r
+\r
+ if ((object != NULL) && (forKey != NULL))\r
+ {\r
+ RaymLock(this);\r
+ removeObjectForKey(forKey);\r
+ KeyAndValue *kv = KeyAndValue::keyAndValue(forKey, object);\r
+ if (kv != NULL)\r
+ {\r
+ _dict.push_back(kv);\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+}\r
+\r
+Object *Dictionary::objectForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::objectForKey(key)");\r
+\r
+ Object *result = NULL;\r
+ if (key != NULL)\r
+ {\r
+ RaymLock(this);\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _dict.begin(); it != _dict.end(); ++it)\r
+ {\r
+ KeyAndValue *kv = (KeyAndValue *)(*it);\r
+ if (key->isEqualToString(kv->key()))\r
+ {\r
+ result = kv->value();\r
+ break;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+ return result;\r
+}\r
+\r
+void Dictionary::removeObjectForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::removeObjectForKey(key)");\r
+\r
+ if (key != NULL)\r
+ {\r
+ RaymLock(this);\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _dict.begin(); it != _dict.end(); ++it)\r
+ {\r
+ KeyAndValue *kv = (KeyAndValue *)(*it);\r
+ if (key->isEqualToString(kv->key()))\r
+ {\r
+ _dict.erase(it);\r
+ kv->release();\r
+ break;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+}\r
+\r
+void Dictionary::removeObjectForKey(const char *key)\r
+{\r
+ if (key != NULL)\r
+ {\r
+ String *k = String::alloc()->initWithUTF8String(key);\r
+ if (k != NULL)\r
+ {\r
+ removeObjectForKey(k);\r
+ k->release();\r
+ }\r
+ }\r
+}\r
+\r
+void Dictionary::setObject(Object *object, const char *forKey)\r
+{\r
+ DebugLog2("Dictionary::setObject(object,key)");\r
+\r
+ if ((object != NULL) && (forKey != NULL))\r
+ {\r
+ String *k = String::alloc()->initWithCString(forKey, UTF8StringEncoding);\r
+ setObject(object, k);\r
+ k->release();\r
+ }\r
+}\r
+\r
+Object *Dictionary::objectForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::objectForKey(key)");\r
+\r
+ String *k = String::alloc()->initWithCString(key, UTF8StringEncoding);\r
+ Object *ret = objectForKey(k);\r
+ k->release();\r
+ return ret;\r
+}\r
+\r
+void Dictionary::setString(String *string, const char *forKey)\r
+{\r
+ DebugLog2("Dictionary::setString(string,key)");\r
+\r
+ setObject(string, forKey);\r
+}\r
+\r
+void Dictionary::setString(const char *string, const char *forKey)\r
+{\r
+ DebugLog2("Dictionary::setString(string,key)");\r
+\r
+ String *v = String::alloc()->initWithCString(string, UTF8StringEncoding);\r
+ setObject(v, forKey);\r
+ v->release();\r
+}\r
+\r
+String *Dictionary::stringForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::stringForKey(key)");\r
+\r
+ String *result = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(String, obj))\r
+ {\r
+ result = (String *)obj;\r
+ }\r
+ return result;\r
+}\r
+\r
+String *Dictionary::stringForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::stringForKey(key)");\r
+\r
+ String *result = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(String, obj))\r
+ {\r
+ result = (String *)obj;\r
+ }\r
+ return result;\r
+}\r
+\r
+void Dictionary::setInteger(int value, String *key)\r
+{\r
+ DebugLog2("Dictionary::setInteger(value,key)");\r
+\r
+ Number *v = Number::alloc()->initWithInt(value);\r
+ setObject(v, key);\r
+ v->release();\r
+}\r
+\r
+void Dictionary::setInteger(int value, const char *key)\r
+{\r
+ DebugLog2("Dictionary::setInteger(value,key)");\r
+\r
+ Number *v = Number::alloc()->initWithInt(value);\r
+ setObject(v, key);\r
+ v->release();\r
+}\r
+\r
+int Dictionary::integerForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::integerForKey(key)");\r
+\r
+ int ret = 0;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Number, obj))\r
+ {\r
+ ret = ((Number *)obj)->intValue();\r
+ }\r
+ return ret;\r
+}\r
+\r
+int Dictionary::integerForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::integerForKey(key)");\r
+\r
+ int ret = 0;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Number, obj))\r
+ {\r
+ ret = ((Number *)obj)->intValue();\r
+ }\r
+ return ret;\r
+}\r
+\r
+Dictionary *Dictionary::dictionaryForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::dictionaryForKey(key)");\r
+\r
+ Dictionary *result = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Dictionary, obj))\r
+ {\r
+ result = (Dictionary *)obj;\r
+ }\r
+ return result;\r
+}\r
+\r
+Dictionary *Dictionary::dictionaryForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::dictionaryForKey(key)");\r
+\r
+ Dictionary *result = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Dictionary, obj))\r
+ {\r
+ result = (Dictionary *)obj;\r
+ }\r
+ return result;\r
+}\r
+\r
+Array *Dictionary::arrayForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::arrayForKey(key)");\r
+\r
+ Array *ret = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Array, obj))\r
+ {\r
+ ret = (Array *)obj;\r
+ }\r
+ return ret;\r
+}\r
+\r
+Array *Dictionary::arrayForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::arrayForKey(key)");\r
+\r
+ Array *ret = NULL;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Array, obj))\r
+ {\r
+ ret = (Array *)obj;\r
+ }\r
+ return ret;\r
+}\r
+\r
+void Dictionary::setBool(bool value, String *key)\r
+{\r
+ DebugLog2("Dictionary::setBool(value,key)");\r
+\r
+ Number *obj = Number::alloc()->initWithBool(value);\r
+ setObject(obj, key);\r
+ obj->release();\r
+}\r
+\r
+void Dictionary::setBool(bool value, const char *key)\r
+{\r
+ DebugLog2("Dictionary::setBool(value,key)");\r
+\r
+ Number *obj = Number::alloc()->initWithBool(value);\r
+ setObject(obj, key);\r
+ obj->release();\r
+}\r
+\r
+bool Dictionary::boolForKey(String *key)\r
+{\r
+ DebugLog2("Dictionary::boolForKey(key)");\r
+\r
+ bool ret = false;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Number, obj))\r
+ {\r
+ ret = ((Number *)obj)->boolValue();\r
+ }\r
+ return ret; \r
+}\r
+\r
+bool Dictionary::boolForKey(const char *key)\r
+{\r
+ DebugLog2("Dictionary::boolForKey(key)");\r
+\r
+ bool ret = false;\r
+ Object *obj = objectForKey(key);\r
+ if ((obj != NULL) && isKindOfClass(Number, obj))\r
+ {\r
+ ret = ((Number *)obj)->boolValue();\r
+ }\r
+ return ret; \r
+}\r
+\r
+Array *Dictionary::allKeys()\r
+{\r
+ DebugLog2("Dictionary::allKeys()");\r
+\r
+ Array *result = Array::alloc()->initWithCapacity(0)->autorelease();\r
+ RaymLock(this);\r
+\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _dict.begin(); it != _dict.end(); ++it)\r
+ {\r
+ KeyAndValue *kv = (KeyAndValue *)(*it);\r
+ result->addObject(kv->key());\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+UInteger Dictionary::count()\r
+{\r
+ DebugLog2("Dictionary::count()");\r
+\r
+ UInteger result = 0;\r
+ RaymLock(this);\r
+ result = _dict.size();\r
+ RaymUnlock(this);\r
+ return result;\r
+}\r
+\r
+#ifdef _WIN32\r
+#define INDENT(LV) for (int i = 0; i < (LV); ++i) { _write(fd, "\t", 1); }\r
+#define WRITE(STR) _write(fd, STR, strlen(STR))\r
+#else\r
+#define INDENT(LV) for (int i = 0; i < (LV); ++i) { write(fd, "\t", 1); }\r
+#define WRITE(STR) write(fd, STR, strlen(STR))\r
+#endif\r
+#define INDENT_S(LV) for (int i =0; i < (LV); ++i) { result += "\t"; }\r
+\r
+void Dictionary::writeValue(int fd, int level, Object *value)\r
+{\r
+ DebugLog2("Dictionary::writeValue(fd,level,value)");\r
+\r
+ const char *str = NULL;\r
+ if (isKindOfClass(Number, value))\r
+ {\r
+ Number *number = (Number *)value;\r
+ str = number->description()->cString();\r
+ if ((strcmp("true", str) == 0) || (strcmp("false", str) == 0))\r
+ {\r
+ INDENT(level);\r
+ WRITE("<");\r
+ WRITE(str);\r
+ WRITE("/>\n");\r
+ }\r
+ else\r
+ {\r
+ INDENT(level);\r
+ WRITE("<integer>");\r
+ WRITE(str);\r
+ WRITE("</integer>\n");\r
+ }\r
+ }\r
+ else if (isKindOfClass(String, value))\r
+ {\r
+ INDENT(level);\r
+ str = "<string>";\r
+ WRITE(str);\r
+ str = ((String *)value)->cString();\r
+ WRITE(str);\r
+ str = "</string>\n";\r
+ WRITE(str);\r
+ }\r
+ else if (isKindOfClass(Array, value))\r
+ {\r
+ INDENT(level);\r
+ str = "<array>\n";\r
+ WRITE(str);\r
+\r
+ Array *array = (Array *)value;\r
+ for (uint i = 0; i < array->count(); ++i)\r
+ {\r
+ writeValue(fd, level + 1, array->objectAtIndex(i));\r
+ }\r
+\r
+ INDENT(level);\r
+ str = "</array>\n";\r
+ WRITE(str);\r
+ }\r
+ else if (isKindOfClass(Dictionary, value))\r
+ {\r
+ ((Dictionary *)value)->writeTo(fd, level);\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("format error: %s()\n", __FUNCTION__);\r
+ }\r
+}\r
+\r
+void Dictionary::writeTo(int fd, int level)\r
+{\r
+ DebugLog2("Dictionary::writeTo(fd,level)");\r
+\r
+ INDENT(level);\r
+ const char *str = "<dict>\n";\r
+ WRITE(str);\r
+\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _dict.begin(); it != _dict.end(); ++it)\r
+ {\r
+ KeyAndValue *kv = (KeyAndValue *)(*it);\r
+ String *key = kv->key();\r
+ INDENT(level + 1);\r
+ str = "<key>";\r
+ WRITE(str);\r
+ str = key->cString();\r
+ WRITE(str);\r
+ str = "</key>\n";\r
+ WRITE(str);\r
+\r
+ writeValue(fd, level + 1, kv->value());\r
+ }\r
+\r
+ INDENT(level);\r
+ str = "</dict>\n";\r
+ WRITE(str);\r
+}\r
+\r
+bool Dictionary::writeToFile(const char *path, bool atomically)\r
+{\r
+ DebugLog2("Dictionary::writeToFile(path,atomically)");\r
+\r
+ return writeToFile(String::alloc()->initWithUTF8String(path)->autorelease(), atomically);\r
+}\r
+\r
+bool Dictionary::writeToFile(String *path, bool atomically)\r
+{\r
+ DebugLog2("Dictionary::writeToFile(path,atomically)");\r
+\r
+ RaymLock(this);\r
+\r
+ const char *outfile = path->cString();\r
+ int fd = -1;\r
+#ifdef _WIN32\r
+ errno_t err = _sopen_s(&fd, outfile, (_O_CREAT | _O_WRONLY | _O_BINARY | _O_TRUNC), _SH_DENYRW, (_S_IREAD | _S_IWRITE));\r
+ if (err != 0)\r
+#else\r
+ if ((fd = open(outfile, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR)) < 0)\r
+#endif\r
+ {\r
+ DebugLog2("file open error: %s\n", outfile);\r
+ return false;\r
+ }\r
+\r
+ const char *xmlDeclaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";\r
+ WRITE(xmlDeclaration);\r
+\r
+ const char *documentType = "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n";\r
+ WRITE(documentType);\r
+\r
+ const char *startElement = "<plist version=\"1.0\">\n";\r
+ WRITE(startElement);\r
+\r
+ writeTo(fd, 0);\r
+\r
+ const char *endElement = "</plist>\n";\r
+ WRITE(endElement);\r
+\r
+#ifdef _WIN32\r
+ _close(fd);\r
+#else\r
+ close(fd);\r
+#endif\r
+\r
+ RaymUnlock(this);\r
+\r
+ return true;\r
+}\r
+\r
+std::string Dictionary::toStringValue(int level, Object *value)\r
+{\r
+ DebugLog2("Dictionary::toStringValue(level,value)");\r
+\r
+ std::string result = "";\r
+\r
+ if (isKindOfClass(Number, value))\r
+ {\r
+ Number *number = (Number *)value;\r
+ const char *str = number->description()->cString();\r
+ if ((strcmp("true", str) == 0) || (strcmp("false", str) == 0))\r
+ {\r
+ INDENT_S(level);\r
+ result += "<";\r
+ result += str;\r
+ result += "/>\n";\r
+ }\r
+ else\r
+ {\r
+ INDENT_S(level);\r
+ result += "<integer>";\r
+ result += str;\r
+ result += "</integer>\n";\r
+ }\r
+ }\r
+ else if (isKindOfClass(String, value))\r
+ {\r
+ INDENT_S(level);\r
+ result += "<string>";\r
+ result += ((String *)value)->cString();\r
+ result += "</string>\n";\r
+ }\r
+ else if (isKindOfClass(Array, value))\r
+ {\r
+ INDENT_S(level);\r
+ result += "<array>\n";\r
+\r
+ Array *array = (Array *)value;\r
+ for (uint i = 0; i < array->count(); ++i)\r
+ {\r
+ result += toStringValue(level + 1, array->objectAtIndex(i));\r
+ }\r
+\r
+ INDENT_S(level);\r
+ result += "</array>\n";\r
+ }\r
+ else if (isKindOfClass(Dictionary, value))\r
+ {\r
+ result += ((Dictionary *)value)->toString(level);\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("format error: %s()\n", __FUNCTION__);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+std::string Dictionary::toString(int level)\r
+{\r
+ DebugLog2("Dictionary::toString(level)");\r
+\r
+ std::string result = "";\r
+\r
+ INDENT_S(level);\r
+ result += "<dict>\n";\r
+\r
+ std::vector<Object *>::iterator it;\r
+ for (it = _dict.begin(); it != _dict.end(); ++it)\r
+ {\r
+ KeyAndValue *kv = (KeyAndValue *)(*it);\r
+ String *key = kv->key();\r
+ INDENT_S(level + 1);\r
+ result += "<key>";\r
+ result += key->cString();\r
+ result += "</key>\n";\r
+\r
+ result += toStringValue(level + 1, kv->value());\r
+ }\r
+\r
+ INDENT_S(level);\r
+ result += "</dict>\n";\r
+\r
+ return result;\r
+}\r
+\r
+std::string Dictionary::toString()\r
+{\r
+ DebugLog2("Dictionary::toString()");\r
+\r
+ RaymLock(this);\r
+\r
+ std::string result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";\r
+ result += "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n";\r
+ result += "<plist version=\"1.0\">\n";\r
+ result += toString(0);\r
+ result += "</plist>\n";\r
+\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+const char *Dictionary::className()\r
+{\r
+ return "Dictionary";\r
+}\r
+\r
+/********************************************************/\r
+Dictionary::KeyAndValue::KeyAndValue()\r
+{\r
+ DebugLog2("Dictionary::KeyAndValue::keyAndValue()");\r
+\r
+ _key = NULL;\r
+ _value = NULL;\r
+}\r
+\r
+Dictionary::KeyAndValue::~KeyAndValue()\r
+{\r
+ if (_key != NULL)\r
+ {\r
+ _key->release();\r
+ }\r
+ if (_value != NULL)\r
+ {\r
+ _value->release();\r
+ }\r
+\r
+ DebugLog2("Dictionary::KeyAndValue::~KeyAndValue()");\r
+}\r
+\r
+Dictionary::KeyAndValue *Dictionary::KeyAndValue::keyAndValue(String *key, Object *value)\r
+{\r
+ DebugLog2("Dictionary::KeyAndValue::keyAndValue(key,value)");\r
+\r
+ KeyAndValue *result = NULL;\r
+ if ((key != NULL) && (value != NULL))\r
+ {\r
+ result = new KeyAndValue();\r
+ key->retain();\r
+ result->_key = key;\r
+ value->retain();\r
+ result->_value = value;\r
+ }\r
+ return result;\r
+}\r
+\r
+String *Dictionary::KeyAndValue::key()\r
+{\r
+ DebugLog2("Dictionary::KeyAndValue::key()");\r
+\r
+ return _key;\r
+}\r
+\r
+Object *Dictionary::KeyAndValue::value()\r
+{\r
+ DebugLog2("Dictionary::KeyAndValue::value()");\r
+\r
+ return _value;\r
+}\r
+\r
+const char *Dictionary::KeyAndValue::className()\r
+{\r
+ return "Dictionary::KeyAndValue";\r
+}\r
+\r
+// for initialization\r
+class DictionaryInternalUse\r
+{\r
+public:\r
+ DictionaryInternalUse();\r
+};\r
+DictionaryInternalUse::DictionaryInternalUse()\r
+{\r
+ // o ma ji na i\r
+ xmlInitParser();\r
+}\r
+static DictionaryInternalUse dictionaryInternalUse__;\r
+\r
+} // Raym\r
--- /dev/null
+//
+// Dictionary.h
+//
+
+#pragma once
+
+#include <vector>
+
+#include <Raym/Object.h>
+#include <Raym/String.h>
+#include <Raym/Array.h>
+#include <Raym/Number.h>
+//#include <Raym/URL.h>
+
+namespace Raym
+{
+
+class Dictionary : public Object
+{
+protected:
+ Dictionary();
+ ~Dictionary();
+
+ class KeyAndValue : public Object
+ {
+ protected:
+ KeyAndValue();
+ ~KeyAndValue();
+ String * _key;
+ Object * _value;
+ public:
+ static KeyAndValue *keyAndValue(String *key, Object *value);
+ String *key();
+ Object *value();
+
+ virtual const char *className();
+ };
+
+ std::vector<Object *> _dict;
+
+
+// static Dictionary *dictionaryWithData(Data *data, StringEncoding encoding);
+// static Array *arrayWithData(Data *data, StringEncoding encoding);
+
+ void writeTo(int fd, int level);
+ void writeValue(int fd, int level, Object *value);
+
+ std::string toString(int level);
+ std::string toStringValue(int level, Object *value);
+
+public:
+ //
+ static Dictionary *dictionaryWithCapacity(UInteger numItems);
+ static Dictionary *dictionaryWithDictionary(Dictionary *dictionary);
+// static Dictionary *dictionaryWithContentsOfURL(URL *url);
+ static Dictionary *alloc();
+ Dictionary *initWithCapacity(UInteger numItems);
+ Dictionary *initWithDictionary(Dictionary *dictionary);
+ Dictionary *initWithContentsOfFile(String *path);
+ Dictionary *initWithContentsOfFile(const char *path);
+ Dictionary *retain();
+ Dictionary *autorelease();
+
+ void setObject(Object *object, String *forKey);
+ Object *objectForKey(String *key);
+ void removeObjectForKey(String *key);
+ void removeObjectForKey(const char *key);
+
+ void setObject(Object *object, const char *forKey);
+ Object *objectForKey(const char *key);
+ void setString(String *string, const char *forKey);
+ void setString(const char *string, const char *forKey);
+ String *stringForKey(String *key);
+ String *stringForKey(const char *key);
+ void setInteger(int value, String *key);
+ void setInteger(int value, const char *key);
+ int integerForKey(String *key);
+ int integerForKey(const char *key);
+ Dictionary *dictionaryForKey(String *key);
+ Dictionary *dictionaryForKey(const char *key);
+ Array *arrayForKey(String *key);
+ Array *arrayForKey(const char *key);
+ void setBool(bool value, String *key);
+ void setBool(bool value, const char *key);
+ bool boolForKey(String *key);
+ bool boolForKey(const char *key);
+
+ Array *allKeys();
+ UInteger count();
+
+ bool writeToFile(String *path, bool atomically);
+ bool writeToFile(const char *path, bool atomically);
+
+ std::string toString();
+
+// virtual String *description();
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//
+// Error.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+
+namespace Raym
+{
+
+class Error : public Object
+{
+protected:
+ Error();
+ ~Error();
+};
+
+} // Raym
+
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+FileHandle::FileHandle()\r
+{\r
+ DebugLog2("FileHandle::FileHandle()");\r
+\r
+ _handle = NULL;\r
+}\r
+\r
+FileHandle::~FileHandle()\r
+{\r
+ if (_handle != NULL)\r
+ {\r
+ CloseHandle(_handle);\r
+ _handle = NULL;\r
+ }\r
+\r
+ DebugLog2("FileHandle::~FileHandle()");\r
+}\r
+\r
+FileHandle *FileHandle::fileHandleWithHANDLE(HANDLE h)\r
+{\r
+ DebugLog2("FileHandle::fileHandleWithHANDLE(h)");\r
+\r
+ FileHandle *handle = new FileHandle();\r
+ handle->init()->autorelease();\r
+ handle->_handle = h;\r
+ handle->_pipe = (GetNamedPipeInfo(h, NULL, NULL, NULL, NULL) != 0);\r
+ return handle;\r
+}\r
+\r
+HANDLE FileHandle::handle()\r
+{\r
+ DebugLog2("FileHandle::handle()");\r
+\r
+ return _handle;\r
+}\r
+\r
+bool FileHandle::isPipe()\r
+{\r
+ DebugLog2("FileHandle::isPipe()");\r
+\r
+ return _pipe;\r
+}\r
+\r
+const char *FileHandle::className()\r
+{\r
+ return "FileHandle";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class FileHandle : public Object\r
+{\r
+private:\r
+#ifdef _WIN32\r
+ HANDLE _handle;\r
+#endif\r
+ bool _pipe;\r
+\r
+protected:\r
+ FileHandle();\r
+ ~FileHandle();\r
+\r
+public:\r
+#ifdef _WIN32\r
+ static FileHandle *fileHandleWithHANDLE(HANDLE h);\r
+ HANDLE handle();\r
+#endif\r
+ bool isPipe();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+static const int TIMEOUT = 1000;\r
+\r
+FileInputStream::FileInputStream()\r
+{\r
+ DebugLog2("FileInputStream::FileInputStream()");\r
+\r
+ _handle = NULL;\r
+}\r
+\r
+FileInputStream::~FileInputStream()\r
+{\r
+ RELEASE(_handle);\r
+\r
+ DebugLog2("FileInputStream::~FileInputStream()");\r
+}\r
+\r
+FileInputStream *FileInputStream::fileInputStream(FileHandle *handle)\r
+{\r
+ DebugLog2("FileInputStream::fileInputStream(handle)");\r
+\r
+ FileInputStream *result = new FileInputStream();\r
+ result->initWithFileHandle(handle)->autorelease();\r
+ return result;\r
+}\r
+\r
+FileInputStream *FileInputStream::initWithFileHandle(FileHandle *handle)\r
+{\r
+ DebugLog2("FileInputStream::initWithFileHandle(handle)");\r
+\r
+ _handle = handle;\r
+ _handle->retain();\r
+ return this;\r
+}\r
+\r
+/*\r
+bool FileInputStream::available()\r
+{\r
+ DebugLog2("FileInputStream::available()");\r
+\r
+ bool result = false;\r
+ if (_handle->isPipe())\r
+ {\r
+ DebugLog3("_handle is pipe.");\r
+ char buf[1024];\r
+ DWORD BytesRead = -1;\r
+ DWORD TotalBytesAvail = -1;\r
+ DWORD BytesLeftThisMessage = -1;\r
+ if (PeekNamedPipe(_handle->handle(), buf, sizeof(buf), &BytesRead, &TotalBytesAvail, &BytesLeftThisMessage))\r
+ {\r
+ DebugLog3("PeekNamedPipe() success: %d, %d, %d", BytesRead, TotalBytesAvail, BytesLeftThisMessage);\r
+ result = (TotalBytesAvail > 0);\r
+\r
+ DWORD len;\r
+ memset(buf, 0x0, sizeof(buf));\r
+ ReadFile(_handle->handle(), buf, sizeof(buf) - 1, &len, NULL);\r
+ DebugLog3("kore: %s", buf);\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("PeekNamedPipe() error: %d", GetLastError());\r
+ }\r
+ }\r
+ return result;\r
+}\r
+*/\r
+\r
+String *FileInputStream::readLine()\r
+{\r
+ DebugLog2("FileInputStream::readLine()");\r
+\r
+ String *result = String::string();\r
+ if (_handle->isPipe())\r
+ {\r
+ int count = 0;\r
+ while (true)\r
+ {\r
+ // パイプを調べる\r
+ char buf[4096];\r
+ DWORD read = -1;\r
+ DWORD avail = -1;\r
+ if (!PeekNamedPipe(_handle->handle(), buf, sizeof(buf) - 1, &read, &avail, NULL))\r
+ {\r
+ // 失敗した場合は終了\r
+ DebugLog3("FileInputStream::readLine(): PeekNamedPipe() error.");\r
+ result = NULL;\r
+ break;\r
+ }\r
+\r
+ // 読み込み可能データがあるか\r
+ if (avail == 0)\r
+ {\r
+ // データが無い場合:最大 TIMEOUT[ms] まで待つ\r
+ if (count++ >= TIMEOUT / 10)\r
+ {\r
+ DebugLog3("FileInputStream::readLine(): timed out.");\r
+ result = NULL;\r
+ break;\r
+ }\r
+ Sleep(10);\r
+ }\r
+ else\r
+ {\r
+ // データが有る場合:\r
+\r
+ // 改行コードをチェック\r
+ char *p = strstr(buf, "\r\n");\r
+ if (p != NULL)\r
+ {\r
+ // CR+LF がある場合\r
+ read = (DWORD)(p - buf + 2);\r
+ }\r
+\r
+ DWORD len;\r
+ if (!ReadFile(_handle->handle(), buf, read, &len, NULL))\r
+ {\r
+ // 失敗した場合は終了\r
+ DebugLog3("FileInputStream::readLine(): ReadFile() error.");\r
+ result = NULL;\r
+ break;\r
+ }\r
+ buf[len] = '\0';\r
+\r
+ // 再度 改行コードをチェック\r
+ p = strstr(buf, "\r\n");\r
+ if (p != NULL)\r
+ {\r
+ *p = '\0';\r
+ }\r
+\r
+ result = result->stringByAppendingString(buf);\r
+\r
+ if (p != NULL)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+const char *FileInputStream::className()\r
+{\r
+ return "FileInputStream";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/InputStream.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class FileInputStream : public InputStream\r
+{\r
+private:\r
+ FileHandle * _handle;\r
+\r
+protected:\r
+ FileInputStream();\r
+ ~FileInputStream();\r
+\r
+public:\r
+ static FileInputStream *fileInputStream(FileHandle *handle);\r
+ FileInputStream *initWithFileHandle(FileHandle *handle);\r
+\r
+ String *readLine();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//\r
+// FileManager.cpp\r
+//\r
+\r
+#include <sys/stat.h>\r
+#include <direct.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+#include "Raym/Raym.h"\r
+\r
+\r
+namespace Raym\r
+{\r
+\r
+DEFINE_STATIC_MUTEX(mutex_);\r
+static FileManager *defaultManager_ = NULL;\r
+\r
+FileManager::FileManager()\r
+{\r
+ DebugLog2("FileManager::FileManager()");\r
+}\r
+\r
+FileManager::~FileManager()\r
+{\r
+ DebugLog2("FileManager::~FileManager()");\r
+}\r
+\r
+FileManager *FileManager::defaultManager()\r
+{\r
+ DebugLog2("FileManager::defaultManager()");\r
+\r
+ mutex_.lock();\r
+ if (defaultManager_ == NULL)\r
+ {\r
+ defaultManager_ = new FileManager();\r
+ ((Object *)defaultManager_)->init();\r
+ ((Object *)defaultManager_)->autorelease(true);\r
+ }\r
+ mutex_.unlock();\r
+\r
+ return defaultManager_;\r
+}\r
+\r
+bool FileManager::fileExistsAtPath(String *path, bool *isDirectory)\r
+{\r
+ DebugLog2("FileManager::fileExistsAtPath(path,isDirectory)");\r
+\r
+ bool result = false;\r
+ if (path != NULL)\r
+ {\r
+#ifdef _WIN32\r
+ struct __stat64 buffer;\r
+ if (_stat64(path->cString(), &buffer) == 0)\r
+ {\r
+ result = true;\r
+ if (isDirectory != NULL)\r
+ {\r
+ *isDirectory = ((buffer.st_mode & _S_IFDIR) == _S_IFDIR);\r
+ }\r
+ }\r
+#else\r
+#endif\r
+ }\r
+ return result;\r
+}\r
+\r
+bool FileManager::fileExistsAtPath(const char *path, bool *isDirectory)\r
+{\r
+ DebugLog2("FileManager::fileExistsAtPath(path,isDirectory)");\r
+\r
+ bool result = false;\r
+ if ((path != NULL) && (isDirectory != NULL))\r
+ {\r
+ result = fileExistsAtPath(String::stringWithUTF8String(path), isDirectory);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool FileManager::removeItemAtPath(String *path, Error **error)\r
+{\r
+ DebugLog2("FileManager::removeItemAtPath()");\r
+\r
+ bool result = false;\r
+ if (path != NULL)\r
+ {\r
+ bool isDir = false;\r
+ if (fileExistsAtPath(path, &isDir))\r
+ {\r
+ if (isDir)\r
+ {\r
+ result = (_rmdir(path->cString()) == 0);\r
+ }\r
+ else\r
+ {\r
+ result = (remove(path->cString()) == 0);\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+const char *FileManager::className()\r
+{\r
+ return "FileManager";\r
+}\r
+\r
+int FileManager::freeSpaceForPath(String *path)\r
+{\r
+ int result = -1;\r
+ TCHAR tpath[MAX_PATH + 1]; \r
+\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = mbstowcs_s(&returnValue, tpath, sizeof(tpath), path->cString(), _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ ULARGE_INTEGER freeBytesAvailable;\r
+ ULARGE_INTEGER totalNumberOfBytes;\r
+ if (GetDiskFreeSpaceEx(tpath, &freeBytesAvailable, &totalNumberOfBytes, NULL))\r
+ {\r
+ result = (int)(freeBytesAvailable.QuadPart / 1024 / 1024 / 1024);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+// FileManager.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include "Raym/Object.h"\r
+#include "Raym/Error.h"\r
+\r
+namespace Raym\r
+{\r
+\r
+class FileManager : public Object\r
+{\r
+protected:\r
+ FileManager();\r
+ ~FileManager();\r
+\r
+public:\r
+ static FileManager *defaultManager();\r
+\r
+ bool fileExistsAtPath(String *path, bool *isDirectory);\r
+ bool fileExistsAtPath(const char *path, bool *isDirectory);\r
+\r
+ bool removeItemAtPath(String *path, Error **error);\r
+\r
+ virtual const char *className();\r
+\r
+ // utility\r
+ static int freeSpaceForPath(String *path);\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 1\r
+\r
+#include <Raym/GlobalHook.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+HINSTANCE GlobalHook_instance_ = NULL;\r
+HOOKPROC GlobalHook_mouseHookProc_ = NULL;\r
+HOOKPROC GlobalHook_keybdHookProc_ = NULL;\r
+#pragma data_seg(".GBLHOOK")\r
+HHOOK GlobalHook_mouseHook_ = NULL;\r
+HHOOK GlobalHook_keybdHook_ = NULL;\r
+unsigned int GlobalHook_check_flag_ = 0;\r
+#pragma data_seg()\r
+\r
+// KeyboardProc\r
+LRESULT CALLBACK GlobalHook_KeyboardProc(int code, // フックコード\r
+ WPARAM wParam, // 仮想キーコード\r
+ LPARAM lParam) // キーストロークメッセージの情報\r
+{\r
+GlobalHook_check_flag_ |= 0x00000001;\r
+ if (code < 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000002;\r
+ return CallNextHookEx(GlobalHook_keybdHook_, code, wParam, lParam);\r
+ }\r
+\r
+ LRESULT result = 0;\r
+ if (GlobalHook_keybdHookProc_ != NULL)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000004;\r
+ result = GlobalHook_keybdHookProc_(code, wParam, lParam);\r
+ }\r
+ if (result == 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000008;\r
+ result = CallNextHookEx(GlobalHook_keybdHook_, code, wParam, lParam);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+// MouseProc\r
+LRESULT CALLBACK GlobalHook_MouseProc(int code, // フックコード\r
+ WPARAM wParam, // メッセージ識別子\r
+ LPARAM lParam) // マウスの座標\r
+{\r
+GlobalHook_check_flag_ |= 0x00000010;\r
+ if (code < 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000020;\r
+ return CallNextHookEx(GlobalHook_mouseHook_, code, wParam, lParam);\r
+ }\r
+\r
+ LRESULT result = 0;\r
+ if (GlobalHook_mouseHookProc_ != NULL)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000040;\r
+ LRESULT result = GlobalHook_mouseHookProc_(code, wParam, lParam);\r
+ }\r
+ if (result == 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00000080;\r
+ result = CallNextHookEx(GlobalHook_mouseHook_, code, wParam, lParam);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+EXPORT unsigned int GetFlag()\r
+{\r
+ return GlobalHook_check_flag_;\r
+}\r
+\r
+EXPORT BOOL SetGlobalHook(int idHook, HOOKPROC lpfn)\r
+{\r
+GlobalHook_check_flag_ |= 0x00000100; \r
+ BOOL result = FALSE;\r
+ switch (idHook)\r
+ {\r
+ case WH_KEYBOARD:\r
+GlobalHook_check_flag_ |= 0x00000200;\r
+ if ((lpfn != NULL) && (GlobalHook_keybdHook_ == NULL))\r
+ {\r
+#if DBG_LEVEL == 0\r
+GlobalHook_check_flag_ != 0x00000400;\r
+ GlobalHook_keybdHook_ = SetWindowsHookEx(WH_KEYBOARD, GlobalHook_KeyboardProc, GlobalHook_instance_, 0);\r
+#else\r
+GlobalHook_check_flag_ |= 0x00000800;\r
+ GlobalHook_keybdHook_ = SetWindowsHookEx(WH_KEYBOARD_LL, GlobalHook_KeyboardProc, GlobalHook_instance_, 0);\r
+#endif\r
+ if (GlobalHook_keybdHook_ != NULL)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00001000;\r
+ result = TRUE;\r
+ GlobalHook_keybdHookProc_ = lpfn;\r
+ }\r
+ }\r
+ else if ((lpfn == NULL) && (GlobalHook_keybdHook_ != NULL))\r
+ {\r
+GlobalHook_check_flag_ |= 0x00002000;\r
+ if (UnhookWindowsHookEx(GlobalHook_keybdHook_) != 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00004000;\r
+ result = TRUE;\r
+ GlobalHook_keybdHook_ = NULL;\r
+ GlobalHook_keybdHookProc_ = NULL;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case WH_MOUSE:\r
+GlobalHook_check_flag_ |= 0x00008000;\r
+ if ((lpfn != NULL) && (GlobalHook_mouseHook_ == NULL))\r
+ {\r
+#if DBG_LEVEL == 0\r
+GlobalHook_check_flag_ |= 0x00010000;\r
+ GlobalHook_mouseHook_ = SetWindowsHookEx(WH_MOUSE, GlobalHook_MouseProc, GlobalHook_instance_, 0);\r
+#else\r
+GlobalHook_check_flag_ |= 0x00020000;\r
+ GlobalHook_mouseHook_ = SetWindowsHookEx(WH_MOUSE_LL, GlobalHook_MouseProc, GlobalHook_instance_, 0);\r
+#endif\r
+ if (GlobalHook_mouseHook_ != NULL)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00040000;\r
+ result = TRUE;\r
+ GlobalHook_mouseHookProc_ = lpfn;\r
+ }\r
+ }\r
+ else if ((lpfn == NULL) && (GlobalHook_mouseHook_ != NULL))\r
+ {\r
+GlobalHook_check_flag_ |= 0x00080000;\r
+ if (UnhookWindowsHookEx(GlobalHook_mouseHook_) != 0)\r
+ {\r
+GlobalHook_check_flag_ |= 0x00100000;\r
+ result = TRUE;\r
+ GlobalHook_mouseHook_ = NULL;\r
+ GlobalHook_mouseHookProc_ = NULL;\r
+GlobalHook_check_flag_ |= 0x00200000;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+GlobalHook_check_flag_ |= 0x00400000;\r
+ break;\r
+ }\r
+GlobalHook_check_flag_ |= 0x00800000;\r
+\r
+ return result;\r
+}\r
+\r
+} // Raym\r
+\r
+BOOL APIENTRY DllMain( HMODULE hModule,\r
+ DWORD ul_reason_for_call,\r
+ LPVOID lpReserved\r
+ )\r
+{\r
+ if (ul_reason_for_call == DLL_PROCESS_ATTACH)\r
+ {\r
+ Raym::GlobalHook_instance_ = hModule;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#ifndef __RAYM_GLOBALHOOK_H__\r
+#define __RAYM_GLOBALHOOK_H__\r
+\r
+#include <windows.h>\r
+\r
+#define EXPORT extern "C" __declspec(dllexport)\r
+\r
+namespace Raym\r
+{\r
+\r
+EXPORT BOOL SetGlobalHook(int, HOOKPROC);\r
+\r
+EXPORT unsigned int GetFlag();\r
+\r
+} // raym\r
+#endif // __RAYM_GLOBALHOOK_H__
\ No newline at end of file
--- /dev/null
+//
+// HTTPURLResponse.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/HTTPURLResponse.h>
+
+namespace Raym
+{
+
+#define RELEASE(P1) \
+ if ((P1) != NULL) \
+ { \
+ (P1)->release(); \
+ (P1) = NULL; \
+ }
+
+HTTPURLResponse::HTTPURLResponse()
+{
+ DebugLog2("HTTPURLResponse::HTTPURLResponse()");
+
+ _statusCode = 0;
+ _HTTPVersion = NULL;
+ _headerFields = NULL;
+}
+
+HTTPURLResponse::~HTTPURLResponse()
+{
+ _statusCode = 0;
+ RELEASE(_HTTPVersion);
+ RELEASE(_headerFields);
+
+ DebugLog2("HTTPURLResponse::~HTTPURLResponse()\n");
+}
+
+HTTPURLResponse *HTTPURLResponse::alloc()
+{
+ DebugLog2("HTTPURLResponse::alloc()");
+
+ return new HTTPURLResponse();
+}
+
+HTTPURLResponse *HTTPURLResponse::initWithURL(URL *url, Integer statusCode, String *HTTPVersion, Dictionary *headerFields)
+{
+ DebugLog2("HTTPURLResponse::initWithURL()");
+
+ if ((url == NULL) || (statusCode == 0) || (HTTPVersion == NULL) || (headerFields == NULL))
+ {
+ DebugLog3("error: parameter check NG.");
+ return NULL;
+ }
+
+ String *MIMEType = NULL;
+ long long content_length = URLResponseUnknownLength;
+ String *encoding = NULL;
+
+ Array *keys = headerFields->allKeys();
+ for (uint i = 0; i < keys->count(); ++i)
+ {
+ String *key = (String *)keys->objectAtIndex(i);
+ String *val = headerFields->stringForKey(key);
+
+ if (key->lowercaseString()->isEqualToString("content-type"))
+ {
+#ifdef _WIN32
+ char *value = _strdup(val->lowercaseString()->cString());
+#else
+ char *value = strdup(val->lowercaseString()->cString());
+#endif
+ if (value != NULL)
+ {
+ char *p = strchr(value, ';');
+ if (p != NULL)
+ {
+ *p = '\0';
+ ++p;
+ while (*p == ' ')
+ {
+ ++p;
+ }
+ }
+ MIMEType = String::stringWithUTF8String(value);
+ if (p != NULL)
+ {
+ if (MIMEType->isEqualToString("text/html"))
+ {
+ if (strncmp("charset=", p, 8) == 0)
+ {
+ encoding = String::stringWithUTF8String(&p[8]);
+ }
+ }
+ }
+ free(value);
+ }
+ }
+ if (key->lowercaseString()->isEqualToString("content-length"))
+ {
+ long long len = atoll(val->cString());
+ char tmp[32];
+#ifdef _WIN32
+ sprintf_s(tmp, sizeof(tmp), "%lld", len);
+#else
+ sprintf(tmp, "%lld", len);
+#endif
+ if (strcmp(tmp, val->cString()) == 0)
+ {
+ content_length = len;
+ }
+ }
+ }
+
+ if (MIMEType == NULL)
+ {
+ MIMEType = String::stringWithUTF8String("text/plain");
+ }
+ if (encoding == NULL)
+ {
+ encoding = String::stringWithUTF8String("us-ascii");
+ }
+
+ URLResponse *ret = URLResponse::initWithURL(url, MIMEType, content_length, encoding);
+ if (ret == NULL)
+ {
+ return NULL;
+ }
+
+ _statusCode = statusCode;
+ _HTTPVersion = HTTPVersion;
+ _HTTPVersion->retain();
+ _headerFields = headerFields;
+ _headerFields->retain();
+
+ return this;
+}
+
+Integer HTTPURLResponse::statusCode()
+{
+ DebugLog2("HTTPURLResponse::statusCode()");
+
+ return _statusCode;
+}
+
+Dictionary *HTTPURLResponse::allHeaderFields()
+{
+ DebugLog2("HTTPURLResponse::allHeaderFields()");
+
+ return _headerFields;
+}
+
+const char *HTTPURLResponse::className()
+{
+ return "HTTPURLResponse";
+}
+
+} // Raym
--- /dev/null
+//
+// HTTPURLResponse.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/String.h>
+#include <Raym/Dictionary.h>
+#include <Raym/URLResponse.h>
+
+namespace Raym
+{
+
+class HTTPURLResponse : public URLResponse
+{
+protected:
+ HTTPURLResponse();
+ ~HTTPURLResponse();
+
+ Integer _statusCode;
+ String * _HTTPVersion;
+ Dictionary * _headerFields;
+
+public:
+ static HTTPURLResponse *alloc();
+ HTTPURLResponse *initWithURL(URL *url, Integer statusCode, String *HTTPVersion, Dictionary *headerFields);
+ Integer statusCode();
+ Dictionary *allHeaderFields();
+
+// virtual String *description();
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+InputStream::InputStream()\r
+{\r
+ DebugLog2("InputStream::InputStream()");\r
+}\r
+\r
+InputStream::~InputStream()\r
+{\r
+ DebugLog2("InputStream::~InputStream()");\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Stream.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class InputStream : public Stream\r
+{\r
+protected:\r
+ InputStream();\r
+ ~InputStream();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//
+// Lock.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/Lock.h>
+
+namespace Raym
+{
+
+Lock *Lock::alloc()
+{
+ DebugLog2("Lock::alloc()");
+
+ return new Lock();
+}
+
+Lock::Lock()
+{
+ DebugLog2("Lock::Lock()");
+}
+
+Lock::~Lock()
+{
+ DebugLog2("Lock::~Lock()");
+}
+
+Lock *Lock::init()
+{
+ return this;
+}
+
+Lock *Lock::retain()
+{
+ DebugLog2("Lock::retain()");
+
+ Object::retain();
+ return this;
+}
+
+Lock *Lock::autorelease()
+{
+ DebugLog2("Lock::autorelease()");
+
+ Object::autorelease();
+ return this;
+}
+
+void Lock::lock()
+{
+ RaymLock(this);
+}
+
+void Lock::unlock()
+{
+ RaymUnlock(this);
+}
+
+const char *Lock::className()
+{
+ return "Lock";
+}
+
+} // Raym
--- /dev/null
+//
+// Lock.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+
+namespace Raym
+{
+
+class Lock : public Object
+{
+protected:
+ Lock();
+ ~Lock();
+
+public:
+ static Lock *alloc();
+ Lock *init();
+ Lock *retain();
+ Lock *autorelease();
+
+ void lock();
+ void unlock();
+
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//\r
+// Log.cpp\r
+//\r
+// 他のRaymクラス群やライブラリとの依存関係は無いように実装する。\r
+// 全体として冗長になってもよいので、このファイルのみで完結すること\r
+//\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <io.h>\r
+#include <share.h>\r
+#include <windows.h>\r
+#include <direct.h>\r
+#include <time.h>\r
+#include <Raym/Log.h>\r
+\r
+\r
+namespace Raym\r
+{\r
+\r
+static const int LOG_SYS_NUM_MIN = 2; // システム上の最小ログファイル数\r
+static const int LOG_SYS_NUM_MAX = 64; // システム上の最大ログファイル数\r
+int LOG_NUM_MAX = 8; // ログファイル数の設定値\r
+\r
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)\r
+static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000Ui64;\r
+#else\r
+static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000ULL;\r
+#endif\r
+\r
+class LogMutex\r
+{\r
+private:\r
+ CRITICAL_SECTION _cs;\r
+\r
+public:\r
+ LogMutex()\r
+ {\r
+ InitializeCriticalSection(&_cs);\r
+ }\r
+ ~LogMutex()\r
+ {\r
+ DeleteCriticalSection(&_cs);\r
+ }\r
+ void lock()\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ void unlock()\r
+ {\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+};\r
+\r
+static LogMutex log_mutex_; // 排他制御用\r
+static FILE * log_fp_ = NULL; // ログファイルのファイルポインタ\r
+static char * log_dir_ = NULL; // ログ格納ディレクトリ\r
+static char * log_filename_ = NULL; // ログファイル名 \r
+static char * log_create_ = NULL; // ログファイルの作成日\r
+\r
+void Log(const char *format, ...)\r
+{\r
+ // ロック\r
+ log_mutex_.lock();\r
+\r
+ // ログ格納ディレクトリの確認\r
+ if (log_dir_ == NULL)\r
+ {\r
+ char execute_path[MAX_PATH + 1];\r
+ memset(execute_path, 0x00, sizeof(execute_path));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ if (GetModuleFileName(NULL, strbuf, MAX_PATH) != 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, execute_path, sizeof(execute_path), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ char *p = strrchr(execute_path, '\\');\r
+ if (p != NULL)\r
+ {\r
+ // 拡張子(exe)をlogに書き換え\r
+ size_t len = strlen(execute_path);\r
+ execute_path[len - 3] = 'l';\r
+ execute_path[len - 2] = 'o';\r
+ execute_path[len - 1] = 'g';\r
+ ++p;\r
+ log_filename_ = _strdup(p);\r
+ *p = '\0';\r
+ strcat_s(execute_path, sizeof(execute_path), "log");\r
+ log_dir_ = _strdup(execute_path);\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((log_dir_ == NULL) || (log_filename_ == NULL))\r
+ {\r
+ // ディレクトリパスが取得できなかった\r
+ MessageBox(NULL, TEXT("ディレクトリパスが取得できませんでした。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ exit(1);\r
+ }\r
+\r
+ // ディレクトリがあるか確認\r
+ struct __stat64 buffer;\r
+ if (_stat64(log_dir_, &buffer) != 0)\r
+ {\r
+ // パスが存在しないのでディレクトリを作成\r
+ if (_mkdir(log_dir_) != 0)\r
+ {\r
+ // ディレクトリが作成できなかった\r
+ MessageBox(NULL, TEXT("ディレクトリが作成できませんでした。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ exit(1);\r
+ }\r
+ }\r
+ else if ((buffer.st_mode & _S_IFDIR) != _S_IFDIR)\r
+ {\r
+ // パスが存在するが、ディレクトリではない\r
+ MessageBox(NULL, TEXT("ログディレクトリが不正です。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ exit(1);\r
+ }\r
+ }\r
+\r
+ // 現在時刻を取得\r
+ FILETIME ft;\r
+ GetSystemTimeAsFileTime(&ft);\r
+\r
+ // EPOCH秒への変換\r
+ __time64_t now_sec;\r
+ __time64_t now_usec;\r
+ now_sec = ft.dwHighDateTime;\r
+ now_sec <<= 32;\r
+ now_sec |= ft.dwLowDateTime;\r
+ now_sec /= 10; /*convert into microseconds*/\r
+ now_sec -= DELTA_EPOCH_IN_MICROSECS;\r
+ now_usec = (now_sec % 1000000UL);\r
+ now_sec = now_sec / 1000000UL;\r
+\r
+ // \r
+ struct tm now;\r
+ _localtime64_s(&now, &now_sec);\r
+ char today[11];\r
+ sprintf_s(today, 11, "%04d/%02d/%02d", now.tm_year + 1900, now.tm_mon + 1, now.tm_mday);\r
+\r
+ // ログファイルのパス\r
+ char log_file_path[MAX_PATH + 1];\r
+ strcpy_s(log_file_path, log_dir_);\r
+ strcat_s(log_file_path, "\\");\r
+ strcat_s(log_file_path, log_filename_);\r
+\r
+ // ログファイルの作成日を確認\r
+ if (log_create_ == NULL)\r
+ {\r
+ // ログファイルを開いてみる\r
+ int fd;\r
+ errno_t err = _sopen_s(&fd, log_file_path, (_O_BINARY | _O_RDONLY), _SH_DENYWR, _S_IREAD);\r
+ if (err == 0)\r
+ {\r
+ // 先頭の10バイトを読み込む\r
+ char tmp[11];\r
+ _read(fd, tmp, 10);\r
+ tmp[10] = '\0';\r
+ log_create_ = _strdup(tmp);\r
+ // 閉じる\r
+ _close(fd);\r
+ }\r
+ else\r
+ {\r
+ log_create_ = _strdup(today);\r
+ }\r
+ }\r
+\r
+ // ログファイルの作成日と今日を比較\r
+ if (strcmp(log_create_, today) != 0)\r
+ {\r
+ // 日が変わっているのでローテーション必要\r
+\r
+ // ログファイルを開いているなら先に閉じる\r
+ if (log_fp_ != NULL)\r
+ {\r
+ fclose(log_fp_);\r
+ log_fp_ = NULL;\r
+ }\r
+\r
+ // 設定値の確認\r
+ if (LOG_NUM_MAX < LOG_SYS_NUM_MIN)\r
+ {\r
+ LOG_NUM_MAX = LOG_SYS_NUM_MIN;\r
+ }\r
+ if (LOG_NUM_MAX > LOG_SYS_NUM_MAX)\r
+ {\r
+ LOG_NUM_MAX = LOG_SYS_NUM_MAX;\r
+ }\r
+\r
+ // ローテーション実施\r
+ char log_file_path_tmp[MAX_PATH + 1];\r
+ char log_file_path_tmp2[MAX_PATH + 1];\r
+ for (int i = LOG_SYS_NUM_MAX - 1; i >= 0; i -= 1)\r
+ {\r
+ sprintf_s(log_file_path_tmp, "%s.%d", log_file_path, i);\r
+ if (i >= LOG_NUM_MAX - 1)\r
+ {\r
+ // delete\r
+ remove(log_file_path_tmp);\r
+ }\r
+ else\r
+ {\r
+ // hogehoge.log.X -> hogehoge.log.(X+1)\r
+ sprintf_s(log_file_path_tmp2, "%s.%d", log_file_path, (i + 1));\r
+ rename(log_file_path_tmp, log_file_path_tmp2);\r
+ }\r
+ }\r
+\r
+ // hogehoge.log -> hogehoge.log.0\r
+ rename(log_file_path, log_file_path_tmp);\r
+\r
+ // ログ作成日を更新\r
+ free(log_create_);\r
+ log_create_ = _strdup(today);\r
+ }\r
+\r
+ // ログファイルがなければ開く\r
+ if (log_fp_ == NULL)\r
+ {\r
+#if 0\r
+ if (fopen_s(&log_fp_, log_file_path, "a") != 0)\r
+ {\r
+ // ログファイルが作成できない\r
+ MessageBox(NULL, TEXT("ログファイルが作成できません。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ exit(1);\r
+ }\r
+#else\r
+ int fd;\r
+ errno_t err = _sopen_s(&fd, log_file_path, (_O_WRONLY | _O_CREAT | _O_APPEND | _O_TEXT), _SH_DENYWR, (_S_IREAD | _S_IWRITE));\r
+ if (err == 0)\r
+ {\r
+ log_fp_ = _fdopen(fd, "a");\r
+ }\r
+ else\r
+ {\r
+ MessageBox(NULL, TEXT("ログファイルが開けねー。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ }\r
+ if (log_fp_ == NULL)\r
+ {\r
+ // ログファイルが作成できない\r
+ MessageBox(NULL, TEXT("ログファイルが作成できません。\nアプリケーションを終了します"), TEXT("ログエラー"), MB_OK);\r
+ exit(1);\r
+ }\r
+#endif\r
+ }\r
+\r
+ // ログを書き込み\r
+ fprintf(log_fp_, "%04d/%02d/%02d %02d:%02d:%02d.%06d ",\r
+ now.tm_year + 1900, now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec, (int)now_usec);\r
+ va_list ap;\r
+ va_start(ap, format);\r
+ vfprintf_s(log_fp_, format, ap);\r
+ va_end(ap);\r
+\r
+ // フォーマットの最後が改行でなければ\r
+ if (format[strlen(format) - 1] != '\n')\r
+ {\r
+ // 改行しておく\r
+ fprintf(log_fp_, "\n");\r
+ }\r
+ fflush(log_fp_);\r
+\r
+ // ロック解除\r
+ log_mutex_.unlock();\r
+}\r
+\r
+} // Foundation\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#ifndef __RAYM_LOG_H__\r
+#define __RAYM_LOG_H__\r
+\r
+#ifdef _WIN32\r
+#else\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+#endif\r
+\r
+namespace Raym\r
+{\r
+\r
+#ifdef _WIN32\r
+extern void Log(const char *format, ...);\r
+#else\r
+inline void Log(const char *format, ...)\r
+{\r
+ va_list ap;\r
+ va_start(ap, format);\r
+ vprintf(format, ap);\r
+ va_end(ap);\r
+}\r
+#endif\r
+extern int LOG_NUM_MAX;\r
+\r
+} // Raym\r
+\r
+#ifndef DBG_LEVEL\r
+#define DBG_LEVEL 0\r
+#endif\r
+\r
+// 常時出力\r
+#define DebugLog0(...) Raym::Log(__VA_ARGS__)\r
+\r
+// システムログ\r
+#if DBG_LEVEL >= 1\r
+#define DebugLog1(...) Raym::Log(__VA_ARGS__)\r
+#else\r
+#define DebugLog1(...)\r
+#endif\r
+\r
+// 走行ルート確認用\r
+#if DBG_LEVEL >= 2\r
+#define DebugLog2(...) Raym::Log(__VA_ARGS__)\r
+#else\r
+#define DebugLog2(...)\r
+#endif\r
+\r
+// 詳細エラー用\r
+#if DBG_LEVEL >= 3\r
+#define DebugLog3(...) Raym::Log(__VA_ARGS__)\r
+#else\r
+#define DebugLog3(...)\r
+#endif\r
+\r
+// コンソール出力用\r
+#if DBG_LEVEL >= 4\r
+#define DebugLog4(...) printf(__VA_ARGS__)\r
+#else\r
+#define DebugLog4(...)\r
+#endif\r
+\r
+#endif // __RAYM_LOG_H__\r
--- /dev/null
+//
+// Number.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/Number.h>
+
+namespace Raym
+{
+
+Number::Number()
+{
+ DebugLog2("Number::Number()");
+
+ _type = TYPE_Unkonown;
+ _value._unsignedLongLongValue = 0;
+}
+
+Number::~Number()
+{
+ DebugLog2("Number::~Number()");
+}
+
+Number *Number::alloc()
+{
+ DebugLog2("Number::alloc()");
+ return new Number();
+}
+
+Number *Number::initWithBool(bool value)
+{
+ DebugLog2("Number::initWithBool()");
+
+ _type = TYPE_Bool;
+ _value._boolValue = value;
+ return this;
+}
+
+Number *Number::initWithInt(int value)
+{
+ DebugLog2("Number::initWithInt()");
+
+ _type = TYPE_Int;
+ _value._intValue = value;
+ return this;
+}
+
+Number *Number::initWithUnsignedInt(uint value)
+{
+ DebugLog2("Number::initWithUnsignedInt()");
+
+ _type = TYPE_UnsignedInt;
+ _value._unsignedIntValue = value;
+ return this;
+}
+
+Number *Number::retain()
+{
+ DebugLog2("Number::retain()");
+
+ Object::retain();
+ return this;
+}
+
+Number *Number::autorelease()
+{
+ DebugLog2("Number::autorelease()");
+
+ Object::autorelease();
+ return this;
+}
+
+bool Number::boolValue()
+{
+ DebugLog2("Number::boolValue()");
+
+ return _value._boolValue;
+}
+
+int Number::intValue()
+{
+ DebugLog2("Number::intValue()");
+
+ return _value._intValue;
+}
+
+uint Number::unsignedIntValue()
+{
+ DebugLog2("Number::unsignedIntValue()");
+
+ return _value._unsignedIntValue;
+}
+
+String *Number::description()
+{
+ DebugLog2("Number::description()");
+
+ switch (_type)
+ {
+ case TYPE_Bool:
+ return String::stringWithUTF8String(_value._boolValue ? "true" : "false");
+
+ case TYPE_Char:
+ case TYPE_Double:
+ case TYPE_Float:
+ break;
+
+ case TYPE_Int:
+ return String::stringWithFormat(String::stringWithUTF8String("%d"), _value._intValue);
+
+ case TYPE_Integer:
+ case TYPE_Long:
+ case TYPE_LongLong:
+ case TYPE_Short:
+ case TYPE_UnsignedChar:
+ break;
+
+ case TYPE_UnsignedInt:
+ return String::stringWithFormat(String::stringWithUTF8String("%u"), _value._intValue);
+ break;
+
+ case TYPE_UnsignedInteger:
+ case TYPE_UnsignedLong:
+ case TYPE_UnsignedLongLong:
+ case TYPE_UnsignedShort:
+ case TYPE_Unkonown:
+ default:
+ break;
+ }
+
+ return String::stringWithFormat(String::stringWithCString("<Number: 0x%08x>", UTF8StringEncoding), this);
+}
+
+
+const char *Number::className()
+{
+ return "Number";
+}
+
+} // Raym
--- /dev/null
+//
+// Number.h
+//
+
+#pragma once
+
+#include <vector>
+
+#include <Raym/Object.h>
+#include <Raym/String.h>
+
+namespace Raym
+{
+
+class Number : public Object
+{
+private:
+ enum {
+ TYPE_Unkonown,
+ TYPE_Bool,
+ TYPE_Char,
+ TYPE_Double,
+ TYPE_Float,
+ TYPE_Int,
+ TYPE_Integer,
+ TYPE_Long,
+ TYPE_LongLong,
+ TYPE_Short,
+ TYPE_UnsignedChar,
+ TYPE_UnsignedInt,
+ TYPE_UnsignedInteger,
+ TYPE_UnsignedLong,
+ TYPE_UnsignedLongLong,
+ TYPE_UnsignedShort
+ } _type;
+ union {
+ bool _boolValue;
+ char _charValue;
+ double _doubleValue;
+ float _floatValue;
+ int _intValue;
+ Integer _integerValue;
+ long _longValue;
+ long long _longlongValue;
+ short _shortValue;
+ unsigned char _unsignedCharValue;
+ unsigned int _unsignedIntValue;
+ UInteger _unsignedIntegerValue;
+ unsigned long _unsignedLongValue;
+ unsigned long long _unsignedLongLongValue;
+ unsigned short _unsignedShortValue;
+ } _value;
+
+protected:
+ Number();
+ ~Number();
+
+public:
+ static Number *alloc();
+ Number *initWithBool(bool value);
+ Number *initWithChar(char value);
+ Number *initWithDouble(double value);
+ Number *initWithFloat(float value);
+ Number *initWithInt(int value);
+ Number *initWithInteger(Integer value);
+ Number *initWithLong(long value);
+ Number *initWithLongLong(long long value);
+ Number *initWithShort(short value);
+ Number *initWithUnsignedChar(unsigned char value);
+ Number *initWithUnsignedInt(unsigned int value);
+ Number *initWithUnsignedInteger(UInteger value);
+ Number *initWithUnsignedLong(unsigned long value);
+ Number *initWithUnsignedLongLong(unsigned long long value);
+ Number *initWithUnsignedShort(unsigned short value);
+ Number *retain();
+ Number *autorelease();
+
+ bool boolValue();
+ int intValue();
+ uint unsignedIntValue();
+
+ String *description();
+
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//
+// Object.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/Object.h>
+#include <Raym/String.h>
+#include <Raym/AutoreleasePool.h>
+
+namespace Raym
+{
+
+#ifdef RAYM_MEMORY_CHECK
+int global_raym_count_ = 0;
+int global_raym_init_count_ = 0;
+int global_raym_retain_count_ = 0;
+int global_raym_autorelease_count_ = 0;
+int global_raym_release_count_ = 0;
+DEFINE_STATIC_MUTEX(global_lock_);
+#endif
+
+Object::Object()
+{
+ DebugLog2("Object::Object()");
+
+ RAYM_LOCK_CREATE;
+ RAYM_COND_CREATE;
+
+ _retainCount = 1;
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_count_;
+// DebugLog0("C:0x%08x:%d", this, global_raym_count_);
+ global_lock_.unlock();
+#endif
+}
+
+Object::~Object()
+{
+ RAYM_LOCK_DESTROY;
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+// DebugLog0("D:0x%08x:%d", this, global_raym_count_);
+ --global_raym_count_;
+ global_lock_.unlock();
+#endif
+
+ DebugLog2("Object::~Object()");
+}
+
+Object *Object::alloc()
+{
+ DebugLog2("Object::alloc()");
+
+ return new Object();
+}
+
+Object *Object::init()
+{
+ DebugLog2("Object::init()");
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_init_count_;
+ global_lock_.unlock();
+#endif
+
+ return this;
+}
+
+Object *Object::retain()
+{
+ DebugLog2("Object::retain()");
+
+ RaymLock(this);
+ ++_retainCount;
+ RaymUnlock(this);
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_retain_count_;
+ global_lock_.unlock();
+#endif
+
+ return this;
+}
+
+Object *Object::autorelease()
+{
+ DebugLog2("Object::autorelease()");
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_autorelease_count_;
+ global_lock_.unlock();
+#endif
+
+ AutoreleasePool::addObject(this);
+ return this;
+}
+
+Object *Object::autorelease(bool rootPool)
+{
+ DebugLog2("Object::autorelease()");
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_autorelease_count_;
+ global_lock_.unlock();
+#endif
+
+ AutoreleasePool::addObject(this, rootPool);
+ return this;
+}
+
+void Object::release()
+{
+ DebugLog2("Object::release()");
+
+#ifdef RAYM_MEMORY_CHECK
+ global_lock_.lock();
+ ++global_raym_release_count_;
+ global_lock_.unlock();
+#endif
+
+ RaymLock(this);
+ if (_retainCount > 0)
+ {
+ --_retainCount;
+ if (_retainCount == 0)
+ {
+ RaymUnlock(this);
+ delete this;
+ return;
+ }
+ }
+ else
+ {
+ DebugLog0("object is already released. (0x%016lx)", this);
+ abort();
+ }
+ RaymUnlock(this);
+}
+
+String *Object::description()
+{
+ return String::stringWithFormat("<%s:0x%016lx>", className(), this);
+}
+
+const char *Object::className()
+{
+ return "Object";
+}
+
+
+} // Raym
--- /dev/null
+//\r
+// Object.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include "Raym/Log.h"\r
+#define RAYM_MEMORY_CHECK\r
+//#define RAYM_MUTEX_CHECK\r
+\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#else\r
+#include <pthread.h>\r
+#endif\r
+#include <stdlib.h>\r
+#include <Raym/Runtime.h>\r
+\r
+#define SET_METHOD(P1, P2) \\r
+ if ((P1) != NULL) \\r
+ { \\r
+ (P1)->release(); \\r
+ } \\r
+ (P1) = (P2); \\r
+ if ((P1) != NULL) \\r
+ { \\r
+ (P1)->retain(); \\r
+ }\r
+\r
+#define RELEASE(P1) \\r
+ if ((P1) != NULL) \\r
+ { \\r
+ (P1)->release(); \\r
+ (P1) = NULL; \\r
+ }\r
+\r
+#define isKindOfClass(CLS, OBJ) \\r
+ (strcmp(#CLS, (OBJ)->className()) == 0)\r
+\r
+\r
+#ifdef _WIN32\r
+\r
+#define RAYM_LOCK_CREATE InitializeCriticalSection(&_cs)\r
+#define RAYM_LOCK_DESTROY DeleteCriticalSection(&_cs)\r
+#define RAYM_COND_CREATE InitializeConditionVariable(&_cond)\r
+#define RAYM_COND_DESTROY pthread_cond_destroy(&_cond)\r
+\r
+#define DEFINE_STATIC_MUTEX(variable) \\r
+class STATIC_MUTEX_variable \\r
+{ \\r
+private: \\r
+ CRITICAL_SECTION _cs; \\r
+ \\r
+public: \\r
+ STATIC_MUTEX_variable() \\r
+ { \\r
+ InitializeCriticalSection(&_cs); \\r
+ } \\r
+ ~STATIC_MUTEX_variable() \\r
+ { \\r
+ DeleteCriticalSection(&_cs); \\r
+ } \\r
+ void lock() \\r
+ { \\r
+ EnterCriticalSection(&_cs); \\r
+ } \\r
+ void unlock() \\r
+ { \\r
+ LeaveCriticalSection(&_cs); \\r
+ } \\r
+}; \\r
+static STATIC_MUTEX_variable variable;\r
+\r
+#else\r
+\r
+#define RAYM_LOCK_CREATE { \\r
+ pthread_mutexattr_t attr; \\r
+ pthread_mutexattr_init(&attr); \\r
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \\r
+ pthread_mutex_init(&_lock, &attr); \\r
+}\r
+#define RAYM_LOCK_DESTROY pthread_mutex_destroy(&_lock)\r
+#define RAYM_COND_CREATE pthread_cond_init(&_cond, NULL)\r
+#define RAYM_COND_DESTROY pthread_cond_destroy(&_cond)\r
+\r
+#define DEFINE_STATIC_MUTEX(variable) \\r
+class STATIC_MUTEX_variable \\r
+{ \\r
+private: \\r
+ pthread_mutex_t _lock; \\r
+ \\r
+public: \\r
+ STATIC_MUTEX_variable() \\r
+ { \\r
+ pthread_mutexattr_t attr; \\r
+ pthread_mutexattr_init(&attr); \\r
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \\r
+ pthread_mutex_init(&_lock, &attr); \\r
+ } \\r
+ ~STATIC_MUTEX_variable() \\r
+ { \\r
+ pthread_mutex_destroy(&_lock); \\r
+ } \\r
+ void lock() \\r
+ { \\r
+ pthread_mutex_lock(&_lock); \\r
+ } \\r
+ void unlock() \\r
+ { \\r
+ pthread_mutex_unlock(&_lock); \\r
+ } \\r
+}; \\r
+static STATIC_MUTEX_variable variable;\r
+#endif\r
+\r
+namespace Raym\r
+{\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+extern int global_raym_count_;\r
+extern int global_raym_init_count_;\r
+extern int global_raym_retain_count_;\r
+extern int global_raym_autorelease_count_;\r
+extern int global_raym_release_count_;\r
+#endif\r
+\r
+typedef unsigned int uint;\r
+typedef unsigned char uchar;\r
+\r
+class String;\r
+\r
+class Object\r
+{\r
+protected:\r
+ Object();\r
+ virtual ~Object();\r
+\r
+ int _retainCount;\r
+\r
+#ifdef RAYM_MUTEX_CHECK\r
+public:\r
+#endif\r
+#ifdef _WIN32\r
+ CRITICAL_SECTION _cs;\r
+ CONDITION_VARIABLE _cond;\r
+#else\r
+ pthread_mutex_t _lock;\r
+ pthread_cond_t _cond;\r
+#endif\r
+\r
+public:\r
+ //\r
+ static Object *alloc();\r
+\r
+ //\r
+ Object *init();\r
+ Object *retain();\r
+ Object *autorelease();\r
+ Object *autorelease(bool rootPool);\r
+ void release();\r
+\r
+ virtual String *description();\r
+\r
+// virtual const char *className() = 0;\r
+ virtual const char *className();\r
+\r
+ friend void RaymLock(Object *);\r
+ friend void RaymUnlock(Object *);\r
+ friend void RaymCondWait(Object *);\r
+ friend void RaymCondTimedWait(Object *, int msec);\r
+ friend void RaymCondSignal(Object *);\r
+ friend void RaymCondBroadcast(Object *);\r
+};\r
+\r
+#ifndef RAYM_MUTEX_CHECK\r
+inline void RaymLock(Object *obj)\r
+{\r
+#ifdef _WIN32\r
+ EnterCriticalSection(&(obj->_cs));\r
+#else\r
+#endif\r
+}\r
+#else\r
+#ifdef _WIN32\r
+#define RaymLock(obj) \\r
+ DebugLog3("before lock: %s %d", __FILE__, __LINE__); \\r
+ EnterCriticalSection(&(obj->_cs)); \\r
+ DebugLog3("after lock: %s %d", __FILE__, __LINE__);\r
+#else\r
+#endif\r
+#endif\r
+\r
+#ifndef RAYM_MUTEX_CHECK\r
+inline void RaymUnlock(Object *obj)\r
+{\r
+#ifdef _WIN32\r
+ LeaveCriticalSection(&(obj->_cs));\r
+#else\r
+#endif\r
+}\r
+#else\r
+#ifdef _WIN32\r
+#define RaymUnlock(obj) \\r
+ DebugLog3("before unlock: %s %d", __FILE__, __LINE__); \\r
+ LeaveCriticalSection(&(obj->_cs)); \\r
+ DebugLog3("after unlock: %s %d", __FILE__, __LINE__);\r
+#else\r
+#endif\r
+#endif\r
+\r
+#ifndef RAYM_MUTEX_CHECK\r
+inline void RaymCondWait(Object *obj)\r
+{\r
+#ifdef _WIN32\r
+ SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), INFINITE);\r
+#else\r
+#endif\r
+}\r
+#else\r
+#ifdef _WIN32\r
+#define RaymCondWait(obj) \\r
+ DebugLog3("before wait: %s %d", __FILE__, __LINE__); \\r
+ SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), INFINITE); \\r
+ DebugLog3("after wait: %s %d", __FILE__, __LINE__);\r
+#else\r
+#endif\r
+#endif\r
+\r
+#ifndef RAYM_MUTEX_CHECK\r
+inline void RaymCondTimedWait(Object *obj, int msec)\r
+{\r
+#ifdef _WIN32\r
+ SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), (DWORD)msec);\r
+#else\r
+#endif\r
+}\r
+#else\r
+#ifdef _WIN32\r
+#define RaymCondTimedWait(obj, msec) \\r
+ DebugLog3("before wait: %s %d", __FILE__, __LINE__); \\r
+ SleepConditionVariableCS(&(obj->_cond), &(obj->_cs), (DWORD)msec); \\r
+ DebugLog3("after wait: %s %d", __FILE__, __LINE__);\r
+#else\r
+#endif\r
+#endif\r
+\r
+#ifndef RAYM_MUTEX_CHECK\r
+inline void RaymCondSignal(Object *obj)\r
+{\r
+#ifdef _WIN32\r
+ WakeConditionVariable(&(obj->_cond));\r
+#else\r
+#endif\r
+}\r
+#else\r
+#ifdef _WIN32\r
+#define RaymCondSignal(obj) \\r
+ DebugLog3("before signal: %s %d", __FILE__, __LINE__); \\r
+ WakeConditionVariable(&(obj->_cond)); \\r
+ DebugLog3("after signal: %s %d", __FILE__, __LINE__);\r
+#else\r
+#endif\r
+#endif\r
+\r
+inline void RaymCondBroadcast(Object *obj)\r
+{\r
+#ifdef _WIN32\r
+ WakeAllConditionVariable(&(obj->_cond));\r
+#else\r
+#endif\r
+}\r
+\r
+\r
+//#define RaymCriticalSection(OBJ, BLOCK) RaymLock(OBJ); BLOCK; RaymUnlock(OBJ);\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+Pipe::Pipe()\r
+{\r
+ DebugLog2("Pipe::Pipe()");\r
+\r
+ _fileHandleForReading = NULL;\r
+ _fileHandleForWriting = NULL;\r
+}\r
+\r
+Pipe::~Pipe()\r
+{\r
+ RELEASE(_fileHandleForReading);\r
+ RELEASE(_fileHandleForWriting);\r
+\r
+ DebugLog2("Pipe::~Pipe()");\r
+}\r
+\r
+Pipe *Pipe::alloc()\r
+{\r
+ DebugLog2("Pipe::alloc()");\r
+\r
+ return new Pipe();\r
+}\r
+\r
+Pipe *Pipe::init()\r
+{\r
+ DebugLog2("Pipe::init()");\r
+\r
+ SECURITY_ATTRIBUTES sa;\r
+ sa.nLength = sizeof(sa);\r
+ sa.lpSecurityDescriptor = 0;\r
+ sa.bInheritHandle = TRUE;\r
+\r
+ HANDLE read;\r
+ HANDLE write;\r
+ if (!CreatePipe(&read, &write, &sa, 0))\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ _fileHandleForReading = FileHandle::fileHandleWithHANDLE(read);\r
+ _fileHandleForReading->retain();\r
+ _fileHandleForWriting = FileHandle::fileHandleWithHANDLE(write);\r
+ _fileHandleForWriting->retain();\r
+\r
+ return this;\r
+}\r
+\r
+FileHandle *Pipe::fileHandleForReading()\r
+{\r
+ DebugLog2("Pipe::fileHandleForReading()");\r
+\r
+ return _fileHandleForReading;\r
+}\r
+\r
+FileHandle *Pipe::fileHandleForWriting()\r
+{\r
+ DebugLog2("Pipe::fileHandleForWriting()");\r
+\r
+ return _fileHandleForWriting;\r
+}\r
+\r
+const char *Pipe::className()\r
+{\r
+ return "Pipe";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/FileHandle.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Pipe : public Object\r
+{\r
+private:\r
+ FileHandle * _fileHandleForReading;\r
+ FileHandle * _fileHandleForWriting;\r
+\r
+protected:\r
+ Pipe();\r
+ ~Pipe();\r
+\r
+public:\r
+ static Pipe *alloc();\r
+ Pipe *init();\r
+\r
+ FileHandle *fileHandleForReading();\r
+ FileHandle *fileHandleForWriting();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//
+//
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/AutoreleasePool.h>
+#include <Raym/String.h>
+#include <Raym/Dictionary.h>
+#include <Raym/Data.h>
+#include <Raym/Date.h>
+#include <Raym/FileManager.h>
+#include <Raym/Bundle.h>
+#include <Raym/Workspace.h>
+#include <Raym/Task.h>
+#include <Raym/Timer.h>
+#include <Raym/Pipe.h>
+#include <Raym/Stream.h>
+#include <Raym/InputStream.h>
+#include <Raym/FileInputStream.h>
+#include <Raym/URLConnection.h>
+#include <Raym/RunningApplication.h>
+#include <Raym/Application.h>
+#include <Raym/Service.h>
+
+namespace Raym
+{
+
+inline String *LocalizedString(const char *key, const char *comment)
+{
+ return Bundle::mainBundle()->localizedStringForKey(key, key, NULL);
+}
+
+} // Raym
+
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+const char *RunningApplication::KEY_IMAGE = "Image";\r
+const char *RunningApplication::KEY_MEMORY = "Memory";\r
+const char *RunningApplication::KEY_STATUS = "Status";\r
+const char *RunningApplication::KEY_USER = "User";\r
+const char *RunningApplication::KEY_CPU = "CPU";\r
+const char *RunningApplication::KEY_PACKAGE = "Package";\r
+\r
+RunningApplication::RunningApplication()\r
+{\r
+ DebugLog2("RunningApplication:RunningApplication()");\r
+\r
+ _pid = -1;\r
+ _execPath = NULL;\r
+ _memory = NULL;\r
+ _status = NULL;\r
+ _user = NULL;\r
+ _cpu = NULL;\r
+ _package = NULL;\r
+}\r
+\r
+RunningApplication::~RunningApplication()\r
+{\r
+ RELEASE(_execPath);\r
+ RELEASE(_memory);\r
+ RELEASE(_status);\r
+ RELEASE(_user);\r
+ RELEASE(_cpu);\r
+ RELEASE(_package);\r
+\r
+ DebugLog2("RunningApplication:~RunningApplication()");\r
+}\r
+\r
+RunningApplication *RunningApplication::alloc()\r
+{\r
+ DebugLog2("RunningApplication:alloc()");\r
+\r
+ return new RunningApplication();\r
+}\r
+\r
+/*\r
+RunningApplication *RunningApplication::initWithProcessEntry(PROCESSENTRY32 *pe)\r
+{\r
+ DebugLog2("RunningApplication:initWithProcessEntry()");\r
+\r
+ char exec_name[MAX_PATH];\r
+ char exec_path[MAX_PATH];\r
+\r
+ memset(exec_name, 0, sizeof(exec_name));\r
+ memset(exec_path, 0, sizeof(exec_path));\r
+\r
+ size_t returnValue;\r
+ if (wcstombs_s(&returnValue, exec_name, sizeof(exec_name), pe->szExeFile, _TRUNCATE) != 0)\r
+ {\r
+ // 変換失敗したら念のため NULL終端\r
+ exec_name[0] = '\0';\r
+ }\r
+\r
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe->th32ProcessID);\r
+ if (hProcess != NULL)\r
+ {\r
+ TCHAR exec[MAX_PATH];\r
+ memset(exec, 0, sizeof(exec));\r
+ DWORD len = sizeof(exec) - 1;\r
+\r
+ if (QueryFullProcessImageName(hProcess, 0, exec, &len))\r
+ {\r
+ if (wcstombs_s(&returnValue, exec_path, sizeof(exec_path), exec, _TRUNCATE) != 0)\r
+ {\r
+ // 変換失敗したら念のため NULL終端\r
+ exec_path[0] = '\0';\r
+ }\r
+ }\r
+\r
+ //\r
+ CloseHandle(hProcess);\r
+ }\r
+\r
+ _pid = pe->th32ProcessID;\r
+ _ppid = pe->th32ParentProcessID;\r
+ _execName = String::alloc()->initWithUTF8String(exec_name);\r
+ DebugLog3("exec_name: %s", exec_name);\r
+ _execPath = String::alloc()->initWithUTF8String(exec_path);\r
+ DebugLog3("exec_path: %s", exec_path);\r
+\r
+ return this;\r
+}\r
+*/\r
+\r
+#define SET_AND_RETAIN(P1, P2) P1 = P2; if (P1 != NULL) P1->retain();\r
+\r
+RunningApplication *RunningApplication::initWithPID(int pid, Dictionary *dict)\r
+{\r
+ DebugLog2("RunningApplication::initWithPID()");\r
+\r
+ if (dict == NULL)\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ _pid = pid;\r
+ SET_AND_RETAIN(_memory, dict->stringForKey(KEY_MEMORY));\r
+ SET_AND_RETAIN(_status, dict->stringForKey(KEY_STATUS));\r
+ SET_AND_RETAIN(_user, dict->stringForKey(KEY_USER));\r
+ SET_AND_RETAIN(_cpu, dict->stringForKey(KEY_CPU));\r
+ SET_AND_RETAIN(_package, dict->stringForKey(KEY_PACKAGE));\r
+\r
+ //\r
+ // プロセスイメージのフルパスを取得\r
+ //\r
+ char exec_path[MAX_PATH];\r
+ memset(exec_path, 0, sizeof(exec_path));\r
+\r
+ // プロセスハンドル取得\r
+ size_t returnValue;\r
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);\r
+ if (hProcess != NULL)\r
+ {\r
+ TCHAR exec[MAX_PATH];\r
+ memset(exec, 0, sizeof(exec));\r
+ DWORD len = sizeof(exec) - 1;\r
+\r
+ // イメージ取得\r
+ if (QueryFullProcessImageName(hProcess, 0, exec, &len))\r
+ {\r
+ // ワイド -> マルチ 変換\r
+ if (wcstombs_s(&returnValue, exec_path, sizeof(exec_path), exec, _TRUNCATE) == 0)\r
+ {\r
+ // 成功\r
+ SET_AND_RETAIN(_execPath, String::stringWithUTF8String(exec_path));\r
+ }\r
+ }\r
+\r
+ // プロセスハンドル解放\r
+ CloseHandle(hProcess);\r
+ }\r
+\r
+ // 取得失敗した場合はdictから設定\r
+ if (_execPath == NULL)\r
+ {\r
+ SET_AND_RETAIN(_execPath, dict->stringForKey(KEY_IMAGE));\r
+ }\r
+\r
+ return this;\r
+}\r
+\r
+bool RunningApplication::isRunning()\r
+{\r
+ DebugLog2("RunningApplication::isRunning()");\r
+\r
+ bool result = false;\r
+ if (_status != NULL)\r
+ {\r
+ result = _status->isEqualToString("Running");\r
+ }\r
+ return result;\r
+}\r
+\r
+String *RunningApplication::executePath()\r
+{\r
+ DebugLog2("RunningApplication::executePath()");\r
+\r
+ return _execPath;\r
+}\r
+\r
+const char *RunningApplication::className()\r
+{\r
+ return "RunningApplication";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/Dictionary.h>\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#include <tlhelp32.h>\r
+#endif\r
+\r
+namespace Raym\r
+{\r
+\r
+class RunningApplication : public Object\r
+{\r
+public:\r
+ const static char *KEY_IMAGE;\r
+ const static char *KEY_MEMORY;\r
+ const static char *KEY_STATUS;\r
+ const static char *KEY_USER;\r
+ const static char *KEY_CPU;\r
+ const static char *KEY_PACKAGE;\r
+\r
+private:\r
+ int _pid;\r
+ String * _execPath;\r
+ String * _memory;\r
+ String * _status;\r
+ String * _user;\r
+ String * _cpu;\r
+ String * _package;\r
+\r
+protected:\r
+ RunningApplication();\r
+ ~RunningApplication();\r
+\r
+public:\r
+ static RunningApplication *alloc();\r
+ RunningApplication *initWithPID(int pid, Dictionary *dict);\r
+\r
+ bool isRunning();\r
+ String *executePath();\r
+\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//
+// Runtime.h
+//
+
+#ifndef __RAYM_RUNTIME_H__
+#define __RAYM_RUNTIME_H__
+
+#include <limits.h>
+
+namespace Raym
+{
+
+#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
+typedef long Integer;
+typedef unsigned long UInteger;
+#else
+typedef int Integer;
+typedef unsigned int UInteger;
+#endif
+
+#define IntegerMax LONG_MAX
+#define IntegerMin LONG_MIN
+#define UIntegerMax ULONG_MAX
+
+#define INTEGER_DEFINED 1
+
+enum {
+ OrderedAscending = -1,
+ OrderedSame,
+ OrderedDescending
+};
+typedef Integer ComparisonResult;
+typedef double TimeInterval;
+
+typedef struct _Range {
+ UInteger location;
+ UInteger length;
+} Range;
+
+enum {
+ NotFound = IntegerMax
+};
+
+} // Raym
+#endif // __RAYM_RUNTIME_H__
\ No newline at end of file
--- /dev/null
+/**\r
+ * @file Service.cpp\r
+ *\r
+ */\r
+\r
+#include <process.h>\r
+\r
+#define DBG_LEVEL 3\r
+#include "Raym/Log.h"\r
+#include "Raym/Raym.h"\r
+\r
+namespace Raym\r
+{\r
+\r
+static Service *sharedService_ = NULL;\r
+\r
+DWORD WINAPI _HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)\r
+{\r
+ DebugLog2("%s() start.", __FUNCTION__);\r
+\r
+ DWORD result = ERROR_CALL_NOT_IMPLEMENTED;\r
+\r
+ Service *service = (Service *)lpContext;\r
+ SERVICE_STATUS ss;\r
+\r
+ switch (dwControl)\r
+ {\r
+ case SERVICE_CONTROL_STOP:\r
+ case SERVICE_CONTROL_PRESHUTDOWN:\r
+\r
+ ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;\r
+ ss.dwWin32ExitCode = NO_ERROR;\r
+ ss.dwServiceSpecificExitCode = 0;\r
+ ss.dwCheckPoint = 1;\r
+ ss.dwWaitHint = 50000;\r
+ ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;\r
+ ss.dwCurrentState = SERVICE_STOP_PENDING;\r
+\r
+ if (service->setServiceStatus(&ss))\r
+ {\r
+ DebugLog2("call stop()");\r
+ service->stop();\r
+\r
+ ss.dwCurrentState = SERVICE_STOPPED;\r
+ ss.dwCheckPoint = 0;\r
+ ss.dwWaitHint = 0;\r
+ \r
+ if (!service->setServiceStatus(&ss))\r
+ {\r
+ DebugLog0("error: SetServiceStatus(): %u", GetLastError());\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: SetServiceStatus(): %u", GetLastError());\r
+ }\r
+\r
+ result = NO_ERROR;\r
+ break;\r
+ }\r
+\r
+ DebugLog2("%s() end.", __FUNCTION__);\r
+\r
+ return result;\r
+}\r
+\r
+VOID WINAPI _ServiceMain(DWORD dwArgc, PTSTR* pszArgv)\r
+{\r
+ if (sharedService_ != NULL)\r
+ {\r
+ sharedService_->serviceMain(dwArgc, pszArgv);\r
+ }\r
+}\r
+\r
+void Service::serviceMain(DWORD dwArgc, PTSTR* pszArgv)\r
+{\r
+ DebugLog2("%s() start.", __FUNCTION__);\r
+\r
+ _serviceStatus = RegisterServiceCtrlHandlerEx(_serviceName, _HandlerEx, this);\r
+ if (_serviceStatus == NULL)\r
+ {\r
+ DebugLog0("error: RegisterServiceCtrlHandler(): %u", GetLastError());\r
+ return;\r
+ }\r
+\r
+ SERVICE_STATUS ss;\r
+ ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;\r
+ ss.dwWin32ExitCode = NO_ERROR;\r
+ ss.dwServiceSpecificExitCode = 0;\r
+ ss.dwCheckPoint = 1;\r
+ ss.dwWaitHint = 15000;\r
+ ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;\r
+ ss.dwCurrentState = SERVICE_START_PENDING;\r
+\r
+ if (!SetServiceStatus(_serviceStatus, &ss))\r
+ {\r
+ DebugLog0("error: SetServiceStatus(): %u", GetLastError());\r
+ return;\r
+ }\r
+\r
+ //\r
+ start();\r
+\r
+ DebugLog2("%s() end.", __FUNCTION__);\r
+}\r
+\r
+Service::Service()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+}\r
+\r
+Service::~Service()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+}\r
+\r
+int Service::main(Service *(*allocator)(), LPWSTR serviceName, int argc, char *argv[])\r
+{\r
+ int result = -1;\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("");\r
+ DebugLog0("Service::main() global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ // ARP生成\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ // winsockの初期化\r
+ WSADATA wsaData;\r
+ WSAStartup(MAKEWORD(2,2), &wsaData);\r
+\r
+ SERVICE_TABLE_ENTRY ServiceTable[] =\r
+ {\r
+ {serviceName, _ServiceMain},\r
+ {NULL, NULL}\r
+ };\r
+\r
+ sharedService_ = allocator();\r
+\r
+ if (sharedService_ != NULL)\r
+ {\r
+ if (sharedService_->init(serviceName))\r
+ {\r
+ StartServiceCtrlDispatcher(ServiceTable);\r
+ }\r
+ }\r
+\r
+ sharedService_->release();\r
+\r
+ // winsockのリソース解放\r
+ WSACleanup();\r
+\r
+ // ARP解放\r
+ pool->release();\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("Service::main() global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ return result;\r
+}\r
+\r
+Service *Service::init(LPWSTR serviceName)\r
+{\r
+ _serviceName = serviceName;\r
+ _serviceStatus = NULL;\r
+ return this;\r
+}\r
+\r
+bool Service::setServiceStatus(SERVICE_STATUS *ss)\r
+{\r
+ return SetServiceStatus(_serviceStatus, ss) ? true : false;\r
+}\r
+\r
+void Service::start()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+}\r
+\r
+void Service::stop()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+}\r
+\r
+void Service::sleep()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+}\r
+\r
+void Service::shutdown()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+ system("shutdown /s /t 180");\r
+}\r
+\r
+void Service::cancelShutdown()\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+ system("shutdown /a");\r
+}\r
+\r
+bool Service::setWakeSchedule(int year, int month, int day, int hour, int min)\r
+{\r
+ return false;\r
+}\r
+\r
+void Service::resetWakeSchedule()\r
+{\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Service::GetHomeDirectory(void)\r
+{\r
+ static char home_directory_[MAX_PATH + 1];\r
+\r
+ memset(home_directory_, 0x00, sizeof(home_directory_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ size_t len = GetEnvironmentVariable(L"USERPROFILE", strbuf, sizeof(strbuf));\r
+ if (len > 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, home_directory_, sizeof(home_directory_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return home_directory_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Service::GetExecutePath(void)\r
+{\r
+ static char execute_path_[MAX_PATH + 1];\r
+ memset(execute_path_, 0x00, sizeof(execute_path_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ if (GetModuleFileName(NULL, strbuf, MAX_PATH) != 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, execute_path_, sizeof(execute_path_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return execute_path_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+//\r
+// remark: This function is not thread safe.\r
+//\r
+const char *Service::GetPublicDirectory(void)\r
+{\r
+ static char public_directory_[MAX_PATH + 1];\r
+\r
+ memset(public_directory_, 0x00, sizeof(public_directory_));\r
+\r
+ TCHAR strbuf[MAX_PATH + 1];\r
+ size_t len = GetEnvironmentVariable(L"PUBLIC", strbuf, sizeof(strbuf));\r
+ if (len > 0)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = wcstombs_s(&returnValue, public_directory_, sizeof(public_directory_), strbuf, _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ return public_directory_;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+/**\r
+ * @file Service.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#ifdef _WIN32\r
+#include <windows.h>\r
+#endif\r
+\r
+#include "Raym/Object.h"\r
+\r
+namespace Raym\r
+{\r
+\r
+class Service : public Object\r
+{\r
+private:\r
+ LPWSTR _serviceName;\r
+ SERVICE_STATUS_HANDLE _serviceStatus;\r
+\r
+protected:\r
+ Service();\r
+ ~Service();\r
+\r
+public:\r
+ static Service *alloc();\r
+ virtual Service *init(LPWSTR serviceName);\r
+ void serviceMain(DWORD dwArgc, PTSTR *pszArgv);\r
+ bool setServiceStatus(SERVICE_STATUS *ss);\r
+ virtual void start();\r
+ virtual void stop();\r
+\r
+ void sleep();\r
+ void shutdown();\r
+ void cancelShutdown();\r
+ bool setWakeSchedule(int year, int month, int day, int hour, int min);\r
+ void resetWakeSchedule();\r
+\r
+ static const char *GetHomeDirectory();\r
+ static const char *GetExecutePath();\r
+ static const char *GetPublicDirectory();\r
+\r
+ // Win32 サービスのエントリポイント\r
+ static int main(Service *(*allocator)(), LPWSTR serviceName, int argc, char *argv[]);\r
+};\r
+\r
+} // Raym\r
+\r
+#define ServiceMain(SVCCLASS, SVCNAME, ARGC, ARGV) Raym::Service::main((Raym::Service *(*)())SVCCLASS::alloc, SVCNAME, ARGC, ARGV)\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+Stream::Stream()\r
+{\r
+ DebugLog2("Stream::Stream()");\r
+}\r
+\r
+Stream::~Stream()\r
+{\r
+ DebugLog2("Stream::~Stream()");\r
+}\r
+\r
+const char *Stream::className()\r
+{\r
+ return "Stream";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Stream : public Object\r
+{\r
+protected:\r
+ Stream();\r
+ ~Stream();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Foundaiton\r
+\r
--- /dev/null
+//\r
+// String.cpp\r
+//\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <regex>\r
+#ifdef _WIN32\r
+#include <time.h>\r
+#else\r
+#include <sys/time.h>\r
+#include <iconv.h>\r
+#endif\r
+#include <errno.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/String.h>\r
+#include <Raym/Array.h>\r
+#include <Raym/Data.h>\r
+\r
+#define HEX2DEC(P1) (('a' <= P1) && (P1 <= 'f') ? (P1 - 'a' + 10) : ('A' <= P1) && (P1 <= 'F') ? (P1 - 'A' + 10) : ('0' <= P1) && (P1 <= '9') ? (P1 - '0') : 0)\r
+\r
+namespace Raym\r
+{\r
+\r
+String *String::alloc()\r
+{\r
+ DebugLog2("String::alloc()");\r
+\r
+ return new String();\r
+}\r
+\r
+String *String::string()\r
+{\r
+ DebugLog2("String::string()");\r
+\r
+ String *result = String::alloc()->init();\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringWithCString(const char *nullTerminatedCString, StringEncoding encoding)\r
+{\r
+ DebugLog2("String::stringWithCString()");\r
+\r
+ String *result = String::alloc()->initWithCString(nullTerminatedCString, encoding);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringWithUTF8String(const char *nullTerminatedCString)\r
+{\r
+ DebugLog2("String::stringWithUTF8String()");\r
+\r
+ String *result = String::alloc()->initWithUTF8String(nullTerminatedCString);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringWithFormat(String *format, ...)\r
+{\r
+ DebugLog2("String::stringWithFormat(String *, ...)");\r
+\r
+ String *result = NULL;\r
+ if (format != NULL)\r
+ {\r
+ va_list ap;\r
+ va_start(ap, format);\r
+ result = String::alloc()->initWithFormat(format->cString(), ap);\r
+ va_end(ap);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringWithFormat(const char *format, ...)\r
+{\r
+ DebugLog2("String::stringWithFormat(const char *, ...)");\r
+\r
+ String *result = NULL;\r
+ if (format != NULL)\r
+ {\r
+ va_list ap;\r
+ va_start(ap, format);\r
+ result = String::alloc()->initWithFormat(format, ap);\r
+ va_end(ap);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringWithContentsOfFile(const char *path, StringEncoding encoding)\r
+{\r
+ DebugLog2("String::stringWithContentsOfFile()");\r
+\r
+ String *result = NULL;\r
+ if (path != NULL)\r
+ {\r
+ Data *data = Data::dataWithContentsOfFile(path);\r
+ if (data != NULL)\r
+ {\r
+#if 0\r
+ char *tmp = (char *)malloc(data->length() + 1);\r
+ if (tmp != NULL)\r
+ {\r
+ memcpy(tmp, data->bytes(), data->length());\r
+ tmp[data->length()] = '\0';\r
+ result = String::stringWithUTF8String(tmp);\r
+ free(tmp);\r
+ }\r
+#else\r
+ result = String::alloc()->initWithData(data, encoding);\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("String::stringWithContentsOfFile(): result == NULL");\r
+ }\r
+#endif\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("String::stringWithContentsOfFile(): data == NULL");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("String::stringWithContentsOfFile(): path == NULL");\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+String *String::stringWithString(String *string)\r
+{\r
+ DebugLog2("String::stringWithString()");\r
+\r
+ String *result = NULL;\r
+ if (string != NULL)\r
+ {\r
+ result = String::alloc()->initWithUTF8String(string->cString());\r
+ if (result != NULL)\r
+ {\r
+ result->autorelease();\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::base64StringWithBytes(const char *bytes, UInteger length)\r
+{\r
+ DebugLog2("String::base64StringWithBytes()");\r
+\r
+ static char base64EncodingTable[64] =\r
+ {\r
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',\r
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',\r
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\r
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'\r
+ };\r
+\r
+ if (bytes == NULL)\r
+ {\r
+ return NULL;\r
+ }\r
+ if (length == 0)\r
+ {\r
+ return String::string();\r
+ }\r
+\r
+ unsigned long long buflen = ((length + 3) / 3) * 4 + 1;\r
+ char *encoded = (char *)malloc(buflen);\r
+ if (encoded == NULL)\r
+ {\r
+ return NULL;\r
+ }\r
+ encoded[buflen - 1] = '\0';\r
+\r
+ unsigned long long in_offset = 0;\r
+ unsigned long long out_offset = 0;\r
+ while (in_offset < length)\r
+ {\r
+ switch (length - in_offset)\r
+ {\r
+ case 1:\r
+ encoded[out_offset] = base64EncodingTable[(bytes[in_offset] & 0xFC) >> 2];\r
+ encoded[out_offset + 1] = base64EncodingTable[((bytes[in_offset] & 0x03) << 4)];\r
+ encoded[out_offset + 2] = '=';\r
+ encoded[out_offset + 3] = '=';\r
+ break;\r
+ case 2:\r
+ encoded[out_offset] = base64EncodingTable[(bytes[in_offset] & 0xFC) >> 2];\r
+ encoded[out_offset + 1] = base64EncodingTable[((bytes[in_offset] & 0x03) << 4) | ((bytes[in_offset + 1] & 0xF0) >> 4)];\r
+ encoded[out_offset + 2] = base64EncodingTable[((bytes[in_offset + 1] & 0x0F) << 2)];\r
+ encoded[out_offset + 3] = '=';\r
+ break;\r
+ default:\r
+ encoded[out_offset] = base64EncodingTable[(bytes[in_offset] & 0xFC) >> 2];\r
+ encoded[out_offset + 1] = base64EncodingTable[((bytes[in_offset] & 0x03) << 4) | ((bytes[in_offset + 1] & 0xF0) >> 4)];\r
+ encoded[out_offset + 2] = base64EncodingTable[((bytes[in_offset + 1] & 0x0F) << 2) | ((bytes[in_offset + 2] & 0xC0) >> 6)];\r
+ encoded[out_offset + 3] = base64EncodingTable[bytes[in_offset + 2] & 0x3F];\r
+ break;\r
+ }\r
+ in_offset += 3;\r
+ out_offset += 4;\r
+ }\r
+\r
+ String *result = String::stringWithUTF8String(encoded);\r
+ free(encoded);\r
+\r
+ return result;\r
+}\r
+\r
+String::String()\r
+{\r
+ DebugLog2("String::String()");\r
+\r
+ _str = NULL;\r
+ _length = -1;\r
+}\r
+\r
+String::~String()\r
+{\r
+ DebugLog2("String::~String(\"%s\")", _str);\r
+\r
+ if (_str != NULL)\r
+ {\r
+ free(_str);\r
+ _str = NULL;\r
+ }\r
+ _length = -1;\r
+}\r
+\r
+String *String::init()\r
+{\r
+ DebugLog2("String::init()");\r
+\r
+ _str = (char *)malloc(1);\r
+ if (_str == NULL)\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+ _str[0] = '\0';\r
+ _length = 0;\r
+ return this;\r
+}\r
+\r
+/*\r
+\r
+8343834D838A835882CC826482748E6397AF82CC90A594F182F096E282A48D9196AF938A955B82DC82C58E6382E882ED82B882A9825182A98C8E8142834C83838381838D83938EF1918A97A682A282E98E6397AF8E788E9D94688145946130ED95908AED836E814197A392458358838C836F8CD997708141938A8E91814190AC92B781458C6F8DCF8145E461945630118EF381458145814592CD30DF81428C6F8DCF8A4581459CC48A5B30ED91BD814593AF92B28145814581BF8AAE30E6814581458259826530ED835183588367814183708375814583608346815B839382698263834583468355815B83588376815B8393814530E581458145814530E5814589EF92B7814581CC836230E68C6F8DCF93498381838A8362836781458145814595B78145\r
+\r
+\r
+*/\r
+\r
+String *String::initWithCString(const char *nullTerminatedCString, StringEncoding encoding)\r
+{\r
+ DebugLog2("String::initWithCString(\"%s\", %d)", nullTerminatedCString, encoding);\r
+\r
+ if (nullTerminatedCString != NULL)\r
+ {\r
+ UInteger length = (UInteger)strlen(nullTerminatedCString);\r
+ if (length != 0)\r
+ {\r
+ switch (encoding)\r
+ {\r
+ case UTF8StringEncoding:\r
+ _str = (char *)malloc(length + 1);\r
+ if (_str != NULL)\r
+ {\r
+ _length = length;\r
+ memcpy(_str, nullTerminatedCString, _length);\r
+ _str[_length] = '\0';\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: %s(): malloc", __FUNCTION__);\r
+ release();\r
+ return NULL;\r
+ }\r
+ break;\r
+\r
+ case ShiftJISStringEncoding:\r
+#ifdef _WIN32\r
+ {\r
+ int wlen = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, nullTerminatedCString, (int)(strlen(nullTerminatedCString) + 1), NULL, 0);\r
+ if (wlen != 0)\r
+ {\r
+ wchar_t *wbuf = (wchar_t *)malloc(sizeof(wchar_t) * (wlen + 1));\r
+ if (wbuf != NULL)\r
+ {\r
+ memset(wbuf, 0x00, sizeof(wchar_t) * (wlen + 1));\r
+ MultiByteToWideChar(CP_ACP, 0, nullTerminatedCString, (int)(strlen(nullTerminatedCString) + 1), wbuf, sizeof(wchar_t) * (wlen + 1));\r
+ int ulen = WideCharToMultiByte(CP_UTF8, 0, wbuf, wlen, NULL, 0, NULL, NULL);\r
+ if (ulen != 0)\r
+ {\r
+ _str = (char *)malloc(ulen + 1);\r
+ if (_str != NULL)\r
+ {\r
+ memset(_str, 0x00, ulen + 1);\r
+ WideCharToMultiByte(CP_UTF8, 0, wbuf, wlen, _str, ulen + 1, NULL, NULL);\r
+ free(wbuf);\r
+ _length = ulen;\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: %s(): malloc", __FUNCTION__);\r
+ free(wbuf);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: %s(): WideCharToMultiByte", __FUNCTION__);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: %s(): malloc", __FUNCTION__);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: %s(): MultiByteToWideChar, 0x%08x", __FUNCTION__, GetLastError());\r
+ if (nullTerminatedCString != NULL)\r
+ {\r
+ char tmp[4096];\r
+ memset(tmp, 0x00, sizeof(tmp));\r
+ for (int i = 0; (i < 2000) && (i < strlen(nullTerminatedCString)); ++i)\r
+ {\r
+ if (nullTerminatedCString[i] == '\0')\r
+ {\r
+ break;\r
+ }\r
+ sprintf_s(&tmp[i*2], 4, "%02X", (unsigned char)nullTerminatedCString[i]);\r
+ }\r
+ DebugLog0("error: binary: %s", tmp);\r
+ }\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+\r
+\r
+#ifndef _WIN32\r
+ {\r
+ iconv_t cd;\r
+ const char *fromcode = NULL;\r
+ switch (encoding)\r
+ {\r
+ case JapaneseEUCStringEncoding:\r
+ fromcode = "EUC-JP";\r
+ break;\r
+ case ShiftJISStringEncoding:\r
+ fromcode = "SHIFT-JIS";\r
+ break;\r
+ default:\r
+ fromcode = "UTF-8";\r
+ break;\r
+ }\r
+ cd = iconv_open("UTF-8", fromcode);\r
+ if (cd != (iconv_t)-1)\r
+ {\r
+ size_t srclen = strlen(nullTerminatedCString);\r
+ _str = (char *)malloc(srclen * 3 + 1);\r
+ if (_str != NULL)\r
+ {\r
+ memset(_str, 0x00, srclen * 3 + 1);\r
+ size_t dstlen = srclen * 3 + 1;\r
+ char *dst = _str;\r
+ char *src = strdup(nullTerminatedCString);\r
+ char *src2 = src;\r
+ size_t ret = iconv(cd, &src, &srclen, &dst, &dstlen);\r
+ if (src2 != NULL)\r
+ {\r
+ free(src2);\r
+ }\r
+ if (ret == -1)\r
+ {\r
+ DebugLog0("nsstr: check 0: %d, %d\n", srclen, errno);\r
+ iconv_close(cd);\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ iconv_close(cd);\r
+\r
+ char *p = (char *)realloc(_str, strlen(_str) + 1);\r
+ if (p == NULL)\r
+ {\r
+ DebugLog0("nsstr: check 1\n");\r
+ release();\r
+ return NULL;\r
+ }\r
+ _str = p;\r
+ _length = strlen(_str);\r
+// DebugLog0("_str = %s\n", _str);\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("nsstr: check 2\n");\r
+ iconv_close(cd);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("nsstr: check 3\n");\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+\r
+ default:\r
+ DebugLog0("warning: Unknown String Encoding: 0x%08x", encoding);\r
+ release();\r
+ return NULL;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // length is zero\r
+ return init();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("warning: string is null.");\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ return this;\r
+}\r
+\r
+String *String::initWithUTF8String(const char *bytes)\r
+{\r
+ DebugLog2("String::initWithUTF8String()");\r
+\r
+ return initWithCString(bytes, UTF8StringEncoding);\r
+}\r
+\r
+String *String::initWithData(Data *data, StringEncoding encoding)\r
+{\r
+ DebugLog2("String::initWithData()");\r
+\r
+ String *result = NULL;\r
+ if (data != NULL)\r
+ {\r
+ char *tmp = (char *)malloc(data->length() + 1);\r
+ if (tmp != NULL)\r
+ {\r
+ memcpy(tmp, data->bytes(), data->length());\r
+ tmp[data->length()] = '\0';\r
+ result = String::initWithCString(tmp, encoding);\r
+ free(tmp);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("warning: data is null.");\r
+ release();\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+String *String::initWithFormat(const char *format, ...)\r
+{\r
+ DebugLog2("String::initWithFormat(const char *, ...)");\r
+\r
+ if (format == NULL)\r
+ {\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ va_list ap;\r
+ va_start(ap, format);\r
+ String *result = initWithFormat(format, ap);\r
+ va_end(ap);\r
+\r
+ return result;\r
+}\r
+\r
+//\r
+// format(書式は1つのみ)とvalueで、新たにmallocした領域にsnprintfして返す。\r
+// 呼び元はfreeすること。malloc失敗等の場合はNULLを返す。\r
+//\r
+static char *print_1(const char *format, void *value)\r
+{\r
+ static const int DEFAULT_LENGTH = 32;\r
+ char *buf = (char *)malloc(DEFAULT_LENGTH);\r
+ if (buf != NULL)\r
+ {\r
+#ifdef _WIN32\r
+ int require = _snprintf_s(buf, DEFAULT_LENGTH, _TRUNCATE, format, value);\r
+#else\r
+ int require = snprintf(buf, DEFAULT_LENGTH, format, value);\r
+#endif\r
+ if (require >= DEFAULT_LENGTH)\r
+ {\r
+ ++require;\r
+ char *buf2 = (char *)realloc(buf, require);\r
+ if (buf2 != NULL)\r
+ {\r
+ buf = buf2;\r
+#ifdef _WIN32\r
+ _snprintf_s(buf, require, _TRUNCATE, format, value);\r
+#else\r
+ snprintf(buf, require, format, value);\r
+#endif\r
+ }\r
+ else\r
+ {\r
+ free(buf);\r
+ buf = NULL;\r
+ }\r
+ }\r
+ }\r
+ return buf;\r
+}\r
+\r
+//\r
+// allocしたs1をs2分加算してreallocしてstrcatし、新しい(または同じ)アドレスを返す。\r
+// 失敗した場合はNULLを返す。その場合 s1 は解放はしない。\r
+static char *strcat_with_realloc(char *s1, const char *s2)\r
+{\r
+ char *buf = (char *)realloc(s1, strlen(s1) + strlen(s2) + 1);\r
+ if (buf != NULL)\r
+ {\r
+#ifdef _WIN32\r
+ strcat_s(buf, (strlen(s1) + strlen(s2) + 1), s2);\r
+#else\r
+ strcat(buf, s2);\r
+#endif\r
+ }\r
+ return buf;\r
+}\r
+\r
+String *String::initWithFormat(const char *format, va_list ap)\r
+{\r
+ DebugLog2("String::initWithFormat(const char *, va_list)");\r
+\r
+ char *buf = NULL;\r
+\r
+#if 0\r
+ va_list ap2;\r
+ va_copy(ap2, ap);\r
+ printf("initWithFormat: format: %s\n", format);\r
+ void *p = va_arg(ap2, void *);\r
+ printf("initWithFormat: arg1: 0x%016lx\n", p);\r
+\r
+ va_end(ap2);\r
+#endif\r
+\r
+ if (strstr(format, "%@") == NULL)\r
+ {\r
+ // とりあえず 256バイトくらいで実行してみて\r
+#define INITIAL_LENGTH 256\r
+ buf = (char *)malloc(INITIAL_LENGTH);\r
+ if (buf == NULL)\r
+ {\r
+ DebugLog3("malloc NG. (1)\n");\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ va_list ap2;\r
+ va_copy(ap2, ap);\r
+\r
+#ifdef _WIN32\r
+ int result = vsnprintf_s(buf, INITIAL_LENGTH, INITIAL_LENGTH - 1, format, ap);\r
+ // バッファに収まっていなければ\r
+ if (result < 0)\r
+ {\r
+ int count = 2;\r
+ while (true)\r
+ {\r
+ char *buf2 = (char *)realloc(buf, INITIAL_LENGTH * count);\r
+ if (buf2 == NULL)\r
+ {\r
+ DebugLog3("realloc NG. (1)\n");\r
+ free(buf);\r
+ va_end(ap2);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ result = vsnprintf_s(buf, INITIAL_LENGTH * count, INITIAL_LENGTH * count - 1, format, ap2);\r
+ if (result >= INITIAL_LENGTH)\r
+ {\r
+ break;\r
+ }\r
+ ++count;\r
+ }\r
+\r
+ }\r
+#else\r
+ int require = vsnprintf(buf, INITIAL_LENGTH, format, ap);\r
+\r
+ // バッファに収まっていなければ\r
+ if (require >= INITIAL_LENGTH)\r
+ {\r
+ // 必要なサイズのバッファを再捕捉\r
+ ++require;\r
+ char *buf2 = (char *)realloc(buf, require);\r
+ if (buf2 == NULL)\r
+ {\r
+ DebugLog3("realloc NG. (1)\n");\r
+ free(buf);\r
+ va_end(ap2);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ vsnprintf(buf, require, format, ap2);\r
+ }\r
+#endif\r
+ va_end(ap2);\r
+ }\r
+ else\r
+ {\r
+ // windows で動かしたら %@ がうまくいかないので\r
+ // しばらく封印する。。。\r
+ printf("%%@ tu ka e nai\n");\r
+ abort();\r
+\r
+#ifdef _WIN32\r
+ char *fmt = _strdup(format);\r
+#else\r
+ char *fmt = strdup(format);\r
+#endif\r
+ if (fmt == NULL)\r
+ {\r
+ DebugLog3("strdup NG.\n");\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ // とりあえず、null文字分確保\r
+ buf = (char *)malloc(1);\r
+ if (buf == NULL)\r
+ {\r
+ DebugLog3("malloc NG. (2)\n");\r
+ free(fmt);\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ char *p1 = fmt;\r
+ char *p2;\r
+ while (true)\r
+ {\r
+ if (strlen(p1) == 0)\r
+ {\r
+ break;\r
+ }\r
+ p2 = strchr(p1 + 1, '%');\r
+ if (p2 != NULL)\r
+ {\r
+ if (p2 == p1 + 1)\r
+ {\r
+ p1 += 2;\r
+ buf = (char *)realloc(buf, strlen(buf) + 1 + 2);\r
+ if (buf == NULL)\r
+ {\r
+ DebugLog3("realloc NG. (2)\n");\r
+ free(fmt);\r
+ release();\r
+ return NULL;\r
+ }\r
+#ifdef _WIN32\r
+ strcat_s(buf, (strlen(buf) + 3), "%%");\r
+#else\r
+ strcat(buf, "%%");\r
+#endif\r
+ }\r
+ else\r
+ {\r
+ *p2 = '\0';\r
+\r
+ if (strstr(p1, "%") != NULL)\r
+ {\r
+ void *ptr;\r
+ char *at;\r
+ if ((at = strstr(p1, "%@")) != NULL)\r
+ {\r
+ ++at;\r
+ *at = 's';\r
+ Object *obj = va_arg(ap, Object *);\r
+ ptr = (void *)obj->description()->cString();\r
+ }\r
+ else\r
+ {\r
+ ptr = va_arg(ap, void *);\r
+ }\r
+\r
+ char *tmpbuf = print_1(p1, ptr);\r
+ if (tmpbuf == NULL)\r
+ {\r
+ free(fmt);\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ char *buf2 = strcat_with_realloc(buf, tmpbuf);\r
+ free(tmpbuf);\r
+ if (buf2 == NULL)\r
+ {\r
+ free(fmt);\r
+ free(buf);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ }\r
+ else\r
+ {\r
+ char *buf2 = strcat_with_realloc(buf, p1);\r
+ if (buf2 == NULL)\r
+ {\r
+ free(fmt);\r
+ free(buf);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ }\r
+\r
+ *p2 = '%';\r
+ p1 = p2;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (*p1 == '%')\r
+ {\r
+ void *ptr = (void *)"(nil)";\r
+ char *at;\r
+ if ((at = strstr(p1, "%@")) != NULL)\r
+ {\r
+ ++at;\r
+ *at = 's';\r
+ Object *obj = va_arg(ap, Object *);\r
+ if (obj != NULL)\r
+ {\r
+ ptr = (void *)obj->description()->cString();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ ptr = va_arg(ap, void *);\r
+ }\r
+ char *tmpbuf = print_1(p1, ptr);\r
+ if (tmpbuf == NULL)\r
+ {\r
+ free(fmt);\r
+ release();\r
+ return NULL;\r
+ }\r
+\r
+ char *buf2 = strcat_with_realloc(buf, tmpbuf);\r
+ free(tmpbuf);\r
+ if (buf2 == NULL)\r
+ {\r
+ free(fmt);\r
+ free(buf);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ }\r
+ else\r
+ {\r
+ char *buf2 = strcat_with_realloc(buf, p1);\r
+ if (buf2 == NULL)\r
+ {\r
+ free(fmt);\r
+ free(buf);\r
+ release();\r
+ return NULL;\r
+ }\r
+ buf = buf2;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ free(fmt);\r
+ }\r
+\r
+ String *result= initWithUTF8String(buf);\r
+ free(buf);\r
+\r
+ return result;\r
+}\r
+\r
+String *String::retain()\r
+{\r
+ DebugLog2("String::retain()");\r
+\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+String *String::autorelease()\r
+{\r
+ DebugLog2("String::autorelease()");\r
+\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+UInteger String::length()\r
+{\r
+ DebugLog2("String::length()");\r
+\r
+ return _length;\r
+}\r
+\r
+bool String::hasPrefix(String *prefix)\r
+{\r
+ bool result = false;\r
+ if (prefix != NULL)\r
+ {\r
+ if (length() >= prefix->length())\r
+ {\r
+ result = (strncmp(_str, prefix->_str, prefix->length()) == 0);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+bool String::hasPrefix(const char *prefix)\r
+{\r
+ DebugLog2("String::hasPrefix()");\r
+\r
+ String *k = String::alloc()->initWithUTF8String(prefix);\r
+ bool ret = hasPrefix(k);\r
+ k->release();\r
+ return ret;\r
+}\r
+\r
+bool String::hasSuffix(String *suffix)\r
+{\r
+ bool result = false;\r
+ if (suffix != NULL)\r
+ {\r
+ if (length() >= suffix->length())\r
+ {\r
+ result = (strncmp(&_str[length() - suffix->length()], suffix->_str, suffix->length()) == 0);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+bool String::hasSuffix(const char *suffix)\r
+{\r
+ DebugLog3("String::hasSuffix()");\r
+\r
+ String *k = String::alloc()->initWithUTF8String(suffix);\r
+ bool ret = hasSuffix(k);\r
+ k->release();\r
+ return ret;\r
+}\r
+\r
+bool String::isEqualToString(String *string)\r
+{\r
+ DebugLog3("String::isEqualToString(\"%s\")", string->cString());\r
+\r
+ bool result = false;\r
+ if (string != NULL)\r
+ {\r
+ if (_str == NULL)\r
+ {\r
+ DebugLog0("String::isEqualToString() : _str == NULL");\r
+ }\r
+ if (string->_str == NULL)\r
+ {\r
+ DebugLog0("String::isEqualToString() : string->_str == NULL");\r
+ }\r
+ result = (strcmp(_str, string->_str) == 0);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool String::isEqualToString(const char *string)\r
+{\r
+ DebugLog3("String::isEqualToString(\"%s\")", string);\r
+\r
+ String *k = String::alloc()->initWithCString(string, UTF8StringEncoding);\r
+ bool ret = isEqualToString(k);\r
+ k->release();\r
+ return ret;\r
+}\r
+\r
+bool String::isMatch(String *regex)\r
+{\r
+ DebugLog3("String::isMatch()");\r
+\r
+ bool result = false;\r
+#if 0\r
+ if (regex != NULL)\r
+ {\r
+ std::regex re(regex->cString());\r
+ std::match_results<const char *>results;\r
+\r
+ result = std::regex_search(_str, results, re, std::regex_constants::match_default);\r
+ }\r
+#else\r
+ if (regex != NULL)\r
+ {\r
+ result = isMatch(regex->cString());\r
+ }\r
+#endif\r
+ return result;\r
+}\r
+\r
+bool String::isMatch(const char *regex)\r
+{\r
+ DebugLog3("String::isMatch()");\r
+\r
+ bool result = false;\r
+ if (regex != NULL)\r
+ {\r
+ std::regex re(regex);\r
+ std::match_results<const char *>results;\r
+\r
+ result = std::regex_search(_str, results, re, std::regex_constants::match_default);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringByAppendingPathComponent(String *pathComponent)\r
+{\r
+ DebugLog3("String::stringByAppendingPathComponent()");\r
+\r
+ String *result = NULL;\r
+ if (pathComponent != NULL)\r
+ {\r
+ Array *paths = pathComponent->pathComponents();\r
+ if (paths != NULL)\r
+ {\r
+ if (paths->count() > 0)\r
+ {\r
+ if (((String *)paths->objectAtIndex(0))->isEqualToString("/") ||\r
+ ((String *)paths->objectAtIndex(0))->isEqualToString("\\"))\r
+ {\r
+ paths->removeObjectAtIndex(0);\r
+ }\r
+ if (paths->count() > 0)\r
+ {\r
+ if (hasSuffix("/") || hasSuffix("\\"))\r
+ {\r
+ result = stringByAppendingString((String *)paths->objectAtIndex(0));\r
+ }\r
+ else\r
+ {\r
+ result = stringByAppendingString("\\");\r
+ result = result->stringByAppendingString((String *)paths->objectAtIndex(0));\r
+ }\r
+ paths->removeObjectAtIndex(0);\r
+ if (paths->count() > 0)\r
+ {\r
+ for (UInteger i = 0; i < paths->count(); ++i)\r
+ {\r
+ result = result->stringByAppendingString("\\");\r
+ result = result->stringByAppendingString((String *)paths->objectAtIndex(i));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (result == NULL)\r
+ {\r
+ result = String::stringWithString(this);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringByAppendingPathComponent(const char *pathComponent)\r
+{\r
+ return stringByAppendingPathComponent(String::stringWithUTF8String(pathComponent));\r
+}\r
+\r
+String *String::stringByAppendingString(String *aString)\r
+{\r
+ String *result = NULL;\r
+ if (aString != NULL)\r
+ {\r
+ result = String::stringWithFormat("%s%s", _str, aString->cString());\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringByAppendingString(const char *aString)\r
+{\r
+ return stringByAppendingString(String::stringWithUTF8String(aString));\r
+}\r
+\r
+String *String::stringByAbbreviatingWithTildeInPath()\r
+{\r
+ String *result = NULL;\r
+ result = String::stringWithUTF8String(cString());\r
+ return result;\r
+}\r
+\r
+String *String::stringByReplacingOccurrencesOfString(String *target, String *replacement)\r
+{\r
+ String *result = NULL;\r
+ if ((target != NULL) && (replacement != NULL))\r
+ {\r
+ std::string tmp = _str;\r
+ while (strstr(tmp.c_str(), target->cString()) != NULL)\r
+ {\r
+ tmp.replace(tmp.find(target->cString(), 0), target->length(), replacement->cString());\r
+ }\r
+ result = String::stringWithUTF8String(tmp.c_str());\r
+ }\r
+ if (result == NULL)\r
+ {\r
+ result = String::stringWithUTF8String(_str);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringByReplacingOccurrencesOfString(const char *target, const char *replacement)\r
+{\r
+ return stringByReplacingOccurrencesOfString(String::stringWithUTF8String(target),\r
+ String::stringWithUTF8String(replacement));\r
+}\r
+\r
+String *String::stringByReplacingOccurrencesOfString(const char *target, String *replacement)\r
+{\r
+ return stringByReplacingOccurrencesOfString(String::stringWithUTF8String(target), replacement);\r
+}\r
+\r
+String *String::stringByStandardizingPath()\r
+{\r
+ String *result = NULL;\r
+ result = String::stringWithUTF8String(cString());\r
+ return result;\r
+}\r
+\r
+String *String::stringByRemovingPercentEncoding()\r
+{\r
+ String *result = NULL;\r
+ char *buf = (char *)malloc(_length + 1);\r
+ if (buf != NULL)\r
+ {\r
+ char *dst = buf;\r
+ char *p = _str;\r
+ while (*p != '\0')\r
+ {\r
+ if (*p == '%')\r
+ {\r
+ *dst = (HEX2DEC(p[1]) << 4) | HEX2DEC(p[2]);\r
+ DebugLog3("%02x", *dst);\r
+ ++dst;\r
+ p += 3;\r
+ }\r
+ else\r
+ {\r
+ *(dst++) = *(p++);\r
+ }\r
+ }\r
+ *dst = '\0';\r
+ DebugLog3("buf: %s", buf);\r
+ result = String::stringWithUTF8String(buf);\r
+ free(buf);\r
+ }\r
+ else\r
+ {\r
+ result = String::string();\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::stringByTrimming()\r
+{\r
+ String *result = NULL;\r
+#ifdef _WIN32\r
+ char *buf = _strdup(_str);\r
+#else\r
+ char *buf = strdup(_str);\r
+#endif\r
+ if (buf != NULL)\r
+ {\r
+ char *st = buf;\r
+ while (true)\r
+ {\r
+ if (*st == ' ')\r
+ {\r
+ ++st;\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ while (true)\r
+ {\r
+ if (st[strlen(st) - 1] == ' ')\r
+ {\r
+ st[strlen(st) - 1] = '\0';\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ result = String::stringWithUTF8String(st);\r
+ free(buf);\r
+ }\r
+ else\r
+ {\r
+ result = String::string();\r
+ }\r
+ return result;\r
+}\r
+\r
+Array *String::pathComponents()\r
+{\r
+ Array *result = Array::arrayWithCapacity(0);\r
+#ifdef _WIN32\r
+ char *tmp = _strdup(_str);\r
+#else\r
+ char *tmp = strdup(_str);\r
+#endif\r
+ if (tmp != NULL)\r
+ {\r
+ char *p = tmp;\r
+ if ((*p == '\\') || (*p == '/'))\r
+ {\r
+ result->addObject(String::stringWithUTF8String("\\"));\r
+ ++p;\r
+ }\r
+ while (p != NULL)\r
+ {\r
+ char *p2 = strchr(p, '\\');\r
+ if (p2 == NULL)\r
+ {\r
+ p2 = strchr(p, '/');\r
+ }\r
+ if (p2 != NULL)\r
+ {\r
+ *p2 = '\0';\r
+ }\r
+ if (strlen(p) > 0)\r
+ {\r
+ result->addObject(String::stringWithUTF8String(p));\r
+ }\r
+ if (p2 != NULL)\r
+ {\r
+ p = p2 + 1;\r
+ }\r
+ else\r
+ {\r
+ p = NULL;\r
+ }\r
+ }\r
+\r
+ free(tmp);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::pathExtension()\r
+{\r
+ String *result = NULL;\r
+ Array *comps = pathComponents();\r
+ if (comps != NULL)\r
+ {\r
+ if (comps->count() > 0)\r
+ {\r
+ String *last = (String *)comps->objectAtIndex(comps->count() - 1);\r
+ char *p = strrchr(last->_str, '.');\r
+ if (p != NULL)\r
+ {\r
+ result = String::stringWithUTF8String(++p);\r
+ }\r
+ }\r
+ }\r
+ if (result == NULL)\r
+ {\r
+ result = String::stringWithUTF8String("");\r
+ }\r
+ return result;\r
+}\r
+\r
+Array *String::componentsSeparatedByString(String *separator)\r
+{\r
+ return componentsSeparatedByString(separator->cString());\r
+}\r
+\r
+Array *String::componentsSeparatedByString(const char *separator)\r
+{\r
+ Array *result = Array::arrayWithCapacity(0);\r
+#ifdef _WIN32\r
+ char *tmp = _strdup(_str);\r
+#else\r
+ char *tmp = strdup(_str);\r
+#endif\r
+ char *p1 = tmp;\r
+ while (true)\r
+ {\r
+ char *p2 = strstr(p1, separator);\r
+ if (p2 != NULL)\r
+ {\r
+ *p2 = '\0';\r
+ result->addObject(String::stringWithUTF8String(p1));\r
+ p1 = p2 + strlen(separator);\r
+ }\r
+ else\r
+ {\r
+ result->addObject(String::stringWithUTF8String(p1));\r
+ break;\r
+ }\r
+ }\r
+ free(tmp);\r
+ return result;\r
+}\r
+\r
+String *String::substringFromIndex(UInteger anIndex)\r
+{\r
+ String *result = NULL;\r
+ if (anIndex < _length)\r
+ {\r
+ result = String::stringWithUTF8String(&_str[anIndex]);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::substringToIndex(UInteger anIndex)\r
+{\r
+ String *result = NULL;\r
+ if (anIndex < _length)\r
+ {\r
+#ifdef _WIN32\r
+ char *tmp = _strdup(_str);\r
+#else\r
+ char *tmp = strdup(_str);\r
+#endif\r
+ if (tmp != NULL)\r
+ {\r
+ tmp[anIndex] = '\0';\r
+ result = String::stringWithUTF8String(tmp);\r
+ free(tmp);\r
+ }\r
+ }\r
+ else if (anIndex == _length)\r
+ {\r
+ result = String::stringWithUTF8String(_str);\r
+ }\r
+ return result;\r
+}\r
+\r
+String *String::lowercaseString()\r
+{\r
+ String *result = NULL;\r
+#ifdef _WIN32\r
+ char *tmp = _strdup(_str);\r
+#else\r
+ char *tmp = strdup(_str);\r
+#endif\r
+ if (tmp != NULL)\r
+ {\r
+ for (size_t idx = 0; idx < strlen(tmp); ++idx)\r
+ {\r
+ tmp[idx] = tolower(tmp[idx]);\r
+ }\r
+ result = String::stringWithUTF8String(tmp);\r
+ free(tmp);\r
+ }\r
+ if (result == NULL)\r
+ {\r
+ result = String::stringWithUTF8String(_str);\r
+ }\r
+ return result;\r
+}\r
+\r
+Range String::rangeOfString(String *aString)\r
+{\r
+ Range result = {NotFound, 0};\r
+ if (aString != NULL)\r
+ {\r
+ result = rangeOfString(aString->cString());\r
+ }\r
+ return result;\r
+}\r
+\r
+Range String::rangeOfString(const char *aString)\r
+{\r
+ Range result = {NotFound, 0};\r
+ if (aString != NULL)\r
+ {\r
+ char *p = strstr(_str, aString);\r
+ if (p != NULL)\r
+ {\r
+ result.location = (UInteger)(p - _str);\r
+ result.length = (UInteger)strlen(aString);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+int String::intValue()\r
+{\r
+ return atoi(_str);\r
+}\r
+\r
+const char *String::cString()\r
+{\r
+ DebugLog2("String::cString()\n");\r
+\r
+ if (_str == NULL)\r
+ {\r
+ DebugLog3("why?\n");\r
+ }\r
+\r
+ return _str;\r
+}\r
+\r
+const char *String::className()\r
+{\r
+ return "String";\r
+}\r
+\r
+String *String::description()\r
+{\r
+ return this;\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+// String.h\r
+//\r
+\r
+#ifndef __RAYM_STRING_H__\r
+#define __RAYM_STRING_H__\r
+\r
+#include <string>\r
+#include <stdarg.h>\r
+#include <Raym/Object.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+enum StringEncoding\r
+{\r
+ ASCIIStringEncoding = 1, /* 0..127 only */\r
+ NEXTSTEPStringEncoding = 2,\r
+ JapaneseEUCStringEncoding = 3,\r
+ UTF8StringEncoding = 4,\r
+ ISOLatin1StringEncoding = 5,\r
+ SymbolStringEncoding = 6,\r
+ NonLossyASCIIStringEncoding = 7,\r
+ ShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */\r
+ ISOLatin2StringEncoding = 9,\r
+ UnicodeStringEncoding = 10,\r
+ WindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */\r
+ WindowsCP1252StringEncoding = 12, /* WinLatin1 */\r
+ WindowsCP1253StringEncoding = 13, /* Greek */\r
+ WindowsCP1254StringEncoding = 14, /* Turkish */\r
+ WindowsCP1250StringEncoding = 15, /* WinLatin2 */\r
+ ISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */\r
+ MacOSRomanStringEncoding = 30,\r
+\r
+ UTF16StringEncoding = UnicodeStringEncoding, /* An alias for UnicodeStringEncoding */\r
+\r
+ UTF16BigEndianStringEncoding = 0x90000100, /* UTF16StringEncoding encoding with explicit endianness specified */\r
+ UTF16LittleEndianStringEncoding = 0x94000100, /* UTF16StringEncoding encoding with explicit endianness specified */\r
+\r
+ UTF32StringEncoding = 0x8c000100,\r
+ UTF32BigEndianStringEncoding = 0x98000100, /* UTF32StringEncoding encoding with explicit endianness specified */\r
+ UTF32LittleEndianStringEncoding = 0x9c000100 /* UTF32StringEncoding encoding with explicit endianness specified */\r
+};\r
+\r
+class Array;\r
+class Data;\r
+\r
+class String : public Object\r
+{\r
+protected:\r
+ String();\r
+ ~String();\r
+\r
+ char * _str;\r
+ unsigned int _length;\r
+\r
+ String *initWithFormat(const char *format, va_list ap);\r
+\r
+ friend void Log(const char *format, ...);\r
+\r
+public:\r
+ String(const char *str);\r
+ static String *alloc();\r
+ static String *string();\r
+ static String *stringWithCString(const char *nullTerminatedCString, StringEncoding encoding);\r
+ static String *stringWithUTF8String(const char *bytes);\r
+ static String *stringWithFormat(String *format, ...);\r
+ static String *stringWithFormat(const char *format, ...);\r
+ static String *stringWithContentsOfFile(const char *path, StringEncoding encoding);\r
+ static String *stringWithString(String *string);\r
+ static String *base64StringWithBytes(const char *bytes, UInteger length);\r
+ String *init();\r
+ String *initWithCString(const char *nullTerminatedCString, StringEncoding encoding);\r
+ String *initWithData(Data *data, StringEncoding encoding);\r
+ String *initWithUTF8String(const char *bytes);\r
+ String *initWithFormat(const char *format, ...);\r
+ String *retain();\r
+ String *autorelease();\r
+\r
+ UInteger length();\r
+\r
+ String *stringByAppendingPathComponent(String *pathComponent);\r
+ String *stringByAppendingPathComponent(const char *pathComponent);\r
+ String *stringByAppendingString(String *aString);\r
+ String *stringByAppendingString(const char *aString);\r
+ String *stringByAbbreviatingWithTildeInPath();\r
+ String *stringByReplacingOccurrencesOfString(String *target, String *replacement);\r
+ String *stringByReplacingOccurrencesOfString(const char *target, const char *replacement);\r
+ String *stringByReplacingOccurrencesOfString(const char *target, String *replacement);\r
+ String *stringByStandardizingPath();\r
+ String *stringByRemovingPercentEncoding();\r
+ String *stringByTrimming();\r
+\r
+ Array *pathComponents();\r
+ String *pathExtension();\r
+\r
+ Array *componentsSeparatedByString(String *separator);\r
+ Array *componentsSeparatedByString(const char *separator);\r
+\r
+ String *substringFromIndex(UInteger anIndex);\r
+ String *substringToIndex(UInteger anIndex);\r
+\r
+ String *lowercaseString();\r
+\r
+ Range rangeOfString(String *aString);\r
+ Range rangeOfString(const char *aString);\r
+\r
+ int intValue();\r
+\r
+ bool hasPrefix(String *prefix);\r
+ bool hasPrefix(const char *prefix);\r
+ bool hasSuffix(String *suffix);\r
+ bool hasSuffix(const char *suffix);\r
+ bool isEqualToString(String *string);\r
+ bool isEqualToString(const char *string);\r
+ bool isMatch(String *regex);\r
+ bool isMatch(const char *regex);\r
+\r
+ const char *cString();\r
+\r
+ virtual String *description();\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
+#endif // __RAYM_STRING_H__\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+Task::Task()\r
+{\r
+ DebugLog2("Task::Task()");\r
+\r
+ _launched = FALSE;\r
+ _launchPath = NULL;\r
+ _arguments = NULL;\r
+ _standardInput = NULL;\r
+ _standardOutput = NULL;\r
+ _standardError = NULL;\r
+\r
+ memset(&_pi, 0, sizeof(_pi));\r
+}\r
+\r
+Task::~Task()\r
+{\r
+ RELEASE(_launchPath);\r
+ RELEASE(_arguments);\r
+ RELEASE(_standardInput);\r
+ RELEASE(_standardOutput);\r
+ RELEASE(_standardError);\r
+\r
+ DebugLog2("Task::~Task()");\r
+}\r
+\r
+Task *Task::alloc()\r
+{\r
+ return new Task();\r
+}\r
+\r
+Task *Task::init()\r
+{\r
+ return this;\r
+}\r
+\r
+void Task::setLaunchPath(String *launchPath)\r
+{\r
+ DebugLog2("Task::setLaunchPath()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ RELEASE(_launchPath);\r
+ _launchPath = (String *)launchPath->retain();\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::setArguments(Array *arguments)\r
+{\r
+ DebugLog2("Task::setArguments()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ RELEASE(_arguments);\r
+ _arguments = (Array *)arguments->retain();\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::setStandardInput(FileHandle *standardInput)\r
+{\r
+ DebugLog2("Task::setStandardInput()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ RELEASE(_standardInput);\r
+ _standardInput = (FileHandle *)standardInput->retain();\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::setStandardOutput(FileHandle *standardOutput)\r
+{\r
+ DebugLog2("Task::setStandardOutput()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ RELEASE(_standardOutput);\r
+ _standardOutput = (FileHandle *)standardOutput->retain();\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::setStandardError(FileHandle *standardError)\r
+{\r
+ DebugLog2("Task::setStandardError()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ RELEASE(_standardError);\r
+ _standardError = (FileHandle *)standardError->retain();\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::launch()\r
+{\r
+ DebugLog2("Task::launch()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (!_launched)\r
+ {\r
+ String *cmd = _launchPath;\r
+ if ((_arguments != NULL) && (_arguments->count() > 0))\r
+ {\r
+ for (uint i = 0; i < _arguments->count(); ++i)\r
+ {\r
+ cmd = cmd->stringByAppendingString(" ");\r
+ cmd = cmd->stringByAppendingString((String *)_arguments->objectAtIndex(i));\r
+ }\r
+ }\r
+ DebugLog2("cmd line: %s", cmd->cString());\r
+\r
+\r
+ TCHAR *tcmd = (TCHAR *)malloc(sizeof(TCHAR) * (cmd->length() + 1));\r
+ if (cmd != NULL)\r
+ {\r
+ errno_t e;\r
+ size_t returnValue;\r
+ e = mbstowcs_s(&returnValue, tcmd, sizeof(TCHAR) * (cmd->length() + 1), cmd->cString(), _TRUNCATE);\r
+ if (e == 0)\r
+ {\r
+ STARTUPINFO si;\r
+ DWORD timeout = 100;\r
+\r
+ memset(&si, 0, sizeof(si));\r
+ si.cb = sizeof(si);\r
+ si.dwFlags = STARTF_USESTDHANDLES;\r
+ si.wShowWindow = SW_HIDE;\r
+\r
+ if (_standardInput != NULL)\r
+ {\r
+ si.hStdInput = _standardInput->handle();\r
+ timeout = 1000;\r
+ }\r
+ if (_standardOutput != NULL)\r
+ {\r
+ si.hStdOutput = _standardOutput->handle();\r
+ }\r
+ if (_standardError != NULL)\r
+ {\r
+ si.hStdError = _standardError->handle();\r
+ }\r
+\r
+ if (CreateProcess(NULL, tcmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &_pi))\r
+ {\r
+ DebugLog2("CreateProcess() success.");\r
+ WaitForInputIdle(_pi.hProcess, timeout);\r
+ WaitForSingleObject(_pi.hProcess, timeout);\r
+ _launched = TRUE;\r
+ }\r
+ }\r
+\r
+ free(tcmd);\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::terminate()\r
+{\r
+ DebugLog2("Task::terminate()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (_launched)\r
+ {\r
+ TerminateProcess(_pi.hProcess, 0);\r
+\r
+ CloseHandle(_pi.hThread);\r
+ CloseHandle(_pi.hProcess);\r
+\r
+ memset(&_pi, 0, sizeof(_pi));\r
+\r
+ _launched = FALSE;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void Task::waitUntilExit()\r
+{\r
+ DebugLog2("Task::waitUntilExit()");\r
+\r
+ bool launched;\r
+ EnterCriticalSection(&_cs);\r
+ launched = _launched;\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ if (launched)\r
+ {\r
+ while (true)\r
+ {\r
+ if (WaitForSingleObject(_pi.hProcess, INFINITE) == WAIT_OBJECT_0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _launched = FALSE;\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+\r
+ DebugLog2("Task::waitUntilExit() done.");\r
+}\r
+\r
+const char *Task::className()\r
+{\r
+ return "Task";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/Array.h>\r
+#include <Raym/FileHandle.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Task : public Object\r
+{\r
+private:\r
+ bool _launched;\r
+ String * _launchPath;\r
+ Array * _arguments;\r
+ FileHandle * _standardInput;\r
+ FileHandle * _standardOutput;\r
+ FileHandle * _standardError;\r
+\r
+#ifdef _WIN32\r
+ PROCESS_INFORMATION _pi;\r
+#endif\r
+\r
+protected:\r
+ Task();\r
+ ~Task();\r
+\r
+public:\r
+ static Task *alloc();\r
+ Task *init();\r
+\r
+ void setLaunchPath(String *launchPath);\r
+ void setArguments(Array *arguments);\r
+ void setStandardInput(FileHandle *standardInput);\r
+ void setStandardOutput(FileHandle *standardOutput);\r
+ void setStandardError(FileHandle *standardError);\r
+\r
+ void launch();\r
+ void terminate();\r
+ void waitUntilExit();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+//
+//
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/Timer.h>
+#include <Raym/AutoreleasePool.h>
+
+#include <process.h>
+
+
+namespace Raym
+{
+
+Timer::Timer()
+{
+ DebugLog2("Timer::Timer()");
+
+ _interval = -1.0;
+ _delegate = NULL;
+ _userInfo = NULL;
+ _repeats = false;
+}
+
+Timer::~Timer()
+{
+ invalidate();
+
+ DebugLog2("Timer::~Timer()");
+}
+
+Timer *Timer::scheduledTimerWithTimeInterval(TimeInterval interval, TimerDelegate *delegate, void *userInfo, bool repeats)
+{
+ DebugLog2("Timer::scheduledTimerWithTimeInterval()");
+
+ Timer *ret = NULL;
+ if ((interval >= 0.0) && (delegate != NULL))
+ {
+ ret = new Timer();
+ ret->_interval = interval;
+ ret->_delegate = delegate;
+ ret->_userInfo = userInfo;
+ ret->_repeats = repeats;
+ if (ret->start())
+ {
+ ret->autorelease();
+ }
+ else
+ {
+ ret->release();
+ ret = NULL;
+ }
+ }
+ return ret;
+}
+
+Timer *Timer::alloc()
+{
+ DebugLog2("Timer::alloc()");
+ return new Timer();
+}
+
+Timer *Timer::initWithTimeInterval(TimeInterval interval, TimerDelegate *delegate, void *userInfo, bool repeats)
+{
+ DebugLog2("Timer::initWithTimeInterval()");
+
+ if ((interval >= 0.0) && (delegate != NULL))
+ {
+ _interval = interval;
+ _delegate = delegate;
+ _userInfo = userInfo;
+ _repeats = repeats;
+ }
+ return this;
+}
+
+void Timer::fire()
+{
+ DebugLog2("Timer::fire()");
+
+ if (start())
+ {
+ DebugLog3("timer started.");
+ }
+ else
+ {
+ DebugLog3("can't start timer.");
+ }
+}
+
+void Timer::invalidate()
+{
+ DebugLog2("Timer::invalidate()");
+
+ EnterCriticalSection(&_cs);
+ if (_state == ST_RUN)
+ {
+ _state = ST_DONE;
+ }
+ LeaveCriticalSection(&_cs);
+
+ bool done = false;
+ while (!done)
+ {
+ EnterCriticalSection(&_cs);
+ done = (_state == ST_IDLE);
+ LeaveCriticalSection(&_cs);
+ if (!done)
+ {
+ ::Sleep(10);
+ }
+ }
+
+ DebugLog2("Timer::invalidate() done.");
+}
+
+void Timer::run()
+{
+ DebugLog2("Timer::run()");
+
+ AutoreleasePool *pool1 = AutoreleasePool::alloc()->init();
+
+ EnterCriticalSection(&_cs);
+
+ while (_state == ST_READY)
+ {
+
+ // state change
+ _state = ST_RUN;
+
+ LeaveCriticalSection(&_cs);
+
+ DWORD startCount = GetTickCount();
+
+ //
+ bool done = false;
+ while (!done)
+ {
+ //
+ Sleep(1);
+
+ DWORD count = GetTickCount();
+ if (startCount + (DWORD)(_interval * 1000) <= count)
+ {
+ // T.O.
+
+ AutoreleasePool *pool2 = AutoreleasePool::alloc()->init();
+ _delegate->timerExpired(this, _userInfo);
+ pool2->release();
+
+ EnterCriticalSection(&_cs);
+
+ if (_repeats)
+ {
+ startCount = GetTickCount();
+ }
+ else
+ {
+ _state = ST_DONE;
+ }
+
+ LeaveCriticalSection(&_cs);
+ }
+
+ // state check
+ EnterCriticalSection(&_cs);
+ done = (_state == ST_DONE);
+ LeaveCriticalSection(&_cs);
+ }
+
+ //
+ EnterCriticalSection(&_cs);
+ break;
+ }
+
+ _state = ST_IDLE;
+
+ LeaveCriticalSection(&_cs);
+
+ pool1->release();
+
+ DebugLog2("Timer::run() done.");
+}
+
+unsigned __stdcall Timer_run(void *arg)
+{
+ ((Timer *)arg)->run();
+ return 0;
+}
+
+bool Timer::start()
+{
+ DebugLog2("Timer::start()");
+
+ bool result = false;
+
+ EnterCriticalSection(&_cs);
+
+ if (_state == ST_IDLE)
+ {
+ DebugLog3("Timer::start() check 001");
+
+ HANDLE h;
+ unsigned int uiThreadId;
+
+ h = (HANDLE)_beginthreadex(NULL,
+ 0,
+ Timer_run,
+ this,
+ 0,
+ &uiThreadId);
+ if (h != NULL)
+ {
+ DebugLog3("Timer::start() check 002");
+
+ _state = ST_READY;
+
+ LeaveCriticalSection(&_cs);
+
+ bool done = false;
+ while (!done)
+ {
+ DebugLog3("Timer::start() check 003");
+
+ bool needSleep = false;
+
+ EnterCriticalSection(&_cs);
+
+ if (_state == ST_IDLE)
+ {
+ DebugLog3("Timer::start() check 004");
+ done = true;
+ }
+ else if (_state == ST_RUN)
+ {
+ DebugLog3("Timer::start() check 005");
+ done = true;
+ result = true;
+ }
+ else if (_state == ST_READY)
+ {
+ DebugLog3("Timer::start() check 006");
+ needSleep = true;
+ }
+ LeaveCriticalSection(&_cs);
+
+ if (needSleep)
+ {
+ DebugLog3("Timer::start() check 007");
+ ::Sleep(100); // 100 ms
+ }
+ }
+
+ EnterCriticalSection(&_cs);
+ }
+ else
+ {
+ DebugLog3("Timer::start() check 008");
+ }
+ }
+ else
+ {
+ DebugLog3("Timer::start() check 009");
+ }
+
+ LeaveCriticalSection(&_cs);
+
+ return result;
+}
+
+void Timer::setRepeats(bool repeats)
+{
+ DebugLog2("Timer::setRepeats()");
+
+ EnterCriticalSection(&_cs);
+ _repeats = repeats;
+ LeaveCriticalSection(&_cs);
+}
+
+void Timer::setTimeInterval(TimeInterval interval)
+{
+ DebugLog2("Timer::setTimeInterval()");
+
+ EnterCriticalSection(&_cs);
+ if (interval >= 0.0)
+ {
+ _interval = interval;
+ }
+ LeaveCriticalSection(&_cs);
+}
+
+void Timer::setUserInfo(void *userInfo)
+{
+ _userInfo = userInfo;
+}
+
+bool Timer::valid()
+{
+ bool result;
+ EnterCriticalSection(&_cs);
+ result = ((_state == ST_READY) || (_state == ST_RUN));
+ LeaveCriticalSection(&_cs);
+ return result;
+}
+
+const char *Timer::className()
+{
+ return "Timer";
+}
+
+} // Raym
--- /dev/null
+//
+//
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+
+namespace Raym
+{
+
+class Timer;
+
+class TimerDelegate
+{
+public:
+ virtual void timerExpired(Timer *timer, void *userInfo) = 0;
+};
+
+class Timer : public Object
+{
+private:
+ TimeInterval _interval;
+ TimerDelegate * _delegate;
+ void * _userInfo;
+ bool _repeats;
+ enum _state
+ {
+ ST_IDLE,
+ ST_READY,
+ ST_RUN,
+ ST_DONE
+ } _state;
+
+ bool start();
+
+protected:
+ Timer();
+ ~Timer();
+
+
+public:
+ static Timer *scheduledTimerWithTimeInterval(TimeInterval interval, TimerDelegate *delegate, void *userInfo, bool repeats);
+ static Timer *alloc();
+
+ Timer *initWithTimeInterval(TimeInterval interval, TimerDelegate *delegate, void *userInfo, bool repeats);
+ void fire();
+
+ void invalidate();
+
+ void run();
+
+ void setRepeats(bool repeats);
+ void setTimeInterval(TimeInterval interval);
+ void setUserInfo(void *userInfo);
+ bool valid();
+
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//
+// URL.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/URL.h>
+
+namespace Raym
+{
+
+#define RELEASE(P1) \
+ if ((P1) != NULL) \
+ { \
+ (P1)->release(); \
+ (P1) = NULL; \
+ }
+
+URL::URL()
+{
+ DebugLog2("URL::URL()\n");
+
+ _scheme = NULL;
+ _host = NULL;
+ _port = -1;
+ _user = NULL;
+ _password = NULL;
+ _path = NULL;
+}
+
+URL::~URL()
+{
+ DebugLog2("URL::~URL()\n");
+
+ RELEASE(_scheme);
+ RELEASE(_host);
+ _port = -1;
+ RELEASE(_user);
+ RELEASE(_password);
+ RELEASE(_path);
+}
+
+URL *URL::URLWithString(String *URLString)
+{
+ DebugLog2("URL::URLWithString()\n");
+
+ URL *result = NULL;
+ if (URLString != NULL)
+ {
+ result = URL::alloc()->initWithString(URLString);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ }
+ return result;
+}
+
+URL *URL::URLWithString(const char *URLString)
+{
+ DebugLog2("URL::URLWithString()\n");
+
+ return URL::URLWithString(String::stringWithUTF8String(URLString));
+}
+
+URL *URL::alloc()
+{
+ DebugLog2("URL::alloc()\n");
+
+ return new URL();
+}
+
+URL *URL::initWithString(String *URLString)
+{
+ DebugLog2("URL::initWithString(String *)\n");
+
+ if (URLString == NULL)
+ {
+ DebugLog0("warning: URLString is NULL\n");
+ release();
+ return NULL;
+ }
+
+ // URL解析で必要なのでコピーする
+#ifdef _WIN32
+ char *urls = _strdup(URLString->cString());
+#else
+ char *urls = strdup(URLString->cString());
+#endif
+ if (urls == NULL)
+ {
+ DebugLog0("warning: strdup NG.\n");
+ release();
+ return NULL;
+ }
+
+ // 最初のコロン":"をスキームの区切り文字として扱う
+ char *colon = strchr(urls, ':');
+ if (colon == NULL)
+ {
+ DebugLog0("warning: format error. (no colon)\n");
+ free(urls);
+ release();
+ return NULL;
+ }
+
+ *colon = '\0';
+
+ // スキーム名のチェック
+ if ((strcmp(urls, "http") != 0) &&
+ (strcmp(urls, "ftp") != 0) &&
+ (strcmp(urls, "file") != 0) &&
+ (strcmp(urls, "udp") != 0))
+ {
+ DebugLog0("warning: format error. (scheme)\n");
+ free(urls);
+ release();
+ return NULL;
+ }
+
+ // スキーム名の保存
+ _scheme = String::alloc()->initWithUTF8String(urls);
+
+ char *urls2 = colon + 1;
+
+ // http または ftp の場合
+ if ((strcmp(urls, "http") == 0) || (strcmp(urls, "ftp") == 0) || (strcmp(urls, "udp") == 0))
+ {
+ // 先頭が "//" かチェック
+ if (strncmp(urls2, "//", 2) != 0)
+ {
+ DebugLog0("warning: format error. (prefix)\n");
+ free(urls);
+ release();
+ return NULL;
+ }
+
+ // "//" をスキップしたアドレスを設定
+ char *host = urls2 + 2;
+
+ // パスとの区切り文字を探す
+ char *slash = strchr(host, '/');
+ if (slash != NULL)
+ {
+ *slash = '\0';
+ }
+
+ // "@" を探す
+ char *atmark = strchr(host, '@');
+ if (atmark != NULL)
+ {
+ // user:password がある
+ *atmark = '\0';
+
+ // ":" を探す
+ colon = strchr(host, ':');
+ if (colon != NULL)
+ {
+ // user と pass
+ *colon = '\0';
+ _user = String::alloc()->initWithUTF8String(host);
+ _password = String::alloc()->initWithUTF8String(colon + 1);
+ }
+ else
+ {
+ // ":"が無いので user のみ
+ _user = String::alloc()->initWithUTF8String(host);
+ _password = String::alloc()->init();
+ }
+
+ host = atmark + 1;
+ }
+ else
+ {
+ _user = String::alloc()->init();
+ _password = String::alloc()->init();
+ }
+
+ // ":" を探す
+ colon = strchr(host, ':');
+ if (colon != NULL)
+ {
+ *colon = '\0';
+ char *port = colon + 1;
+ _port = atoi(port);
+ char tmpport[80];
+#ifdef _WIN32
+ _snprintf_s(tmpport, sizeof(tmpport), _TRUNCATE, "%d", _port);
+#else
+ snprintf(tmpport, sizeof(tmpport), "%d", _port);
+#endif
+ if (strcmp(tmpport, port) != 0)
+ {
+ DebugLog0("warning: format error. (port)\n");
+ free(urls);
+ release();
+ return NULL;
+ }
+ }
+ else if (strcmp(urls, "http") == 0)
+ {
+ _port = 80;
+ }
+ else if (strcmp(urls, "ftp") == 0)
+ {
+ _port = 21;
+ }
+ else
+ {
+ _port = -1;
+ }
+
+ _host = String::alloc()->initWithUTF8String(host);
+
+ if (slash == NULL)
+ {
+ _path = String::alloc()->initWithUTF8String("/");
+ }
+ else
+ {
+ *slash = '/';
+ _path = String::alloc()->initWithUTF8String(slash);
+ }
+ }
+ else if (strcmp(urls, "file") == 0)
+ {
+ DebugLog0("not implement.\n");
+ }
+ else
+ {
+ DebugLog0("not implement.\n");
+ }
+
+ free(urls);
+
+ return this;
+}
+
+URL *URL::initWithString(const char *URLString)
+{
+ DebugLog2("URL::initWithString(const char *)\n");
+
+ return initWithString(String::stringWithUTF8String(URLString));
+}
+
+URL *URL::retain()
+{
+ DebugLog2("URL::retain()");
+
+ Object::retain();
+ return this;
+}
+
+String *URL::scheme()
+{
+ return _scheme;
+}
+
+String *URL::host()
+{
+ return _host;
+}
+
+int URL::port()
+{
+ return _port;
+}
+
+String *URL::user()
+{
+ return _user;
+}
+
+String *URL::password()
+{
+ return _password;
+}
+
+String *URL::path()
+{
+ return _path;
+}
+
+const char *URL::className()
+{
+ return "URL";
+}
+
+} // Raym
--- /dev/null
+//
+// URL.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/String.h>
+
+namespace Raym
+{
+
+class URL : public Object
+{
+protected:
+ URL();
+ ~URL();
+
+ String * _scheme;
+ String * _host;
+ int _port;
+ String * _user;
+ String * _password;
+ String * _path;
+
+public:
+ static URL *alloc();
+ static URL *URLWithString(String *URLString);
+ static URL *URLWithString(const char *URLString);
+
+ URL *initWithString(String *URLString);
+ URL *initWithString(const char *URLString);
+ URL *retain();
+
+ String *scheme();
+ String *host();
+ int port();
+ String *user();
+ String *password();
+ String *path();
+
+// virtual String *description();
+ virtual const char *className();
+};
+
+} // Raym
+
--- /dev/null
+//
+// URLConnection.cpp
+//
+
+#ifdef _WIN32
+#include <windows.h>
+#include <io.h>
+#else
+#include <sys/socket.h>
+#include <netdb.h>
+#include <unistd.h>
+#endif
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/URLConnection.h>
+#include <Raym/HTTPURLResponse.h>
+
+namespace Raym
+{
+
+URLConnection::URLConnection()
+{
+}
+
+URLConnection::~URLConnection()
+{
+}
+
+//
+// socketからterminatorで指定する終端文字列に遭遇するまで読み込む。
+// 返却したバッファは必ずfreeすること。
+// 失敗した場合はNULLを返却する。
+//
+#ifdef _WIN32
+static char *readLine(SOCKET socket, const char *terminator)
+#else
+static char *readLine(int socket, const char *terminator)
+#endif
+{
+ char *buf = NULL;
+ if ((socket >= 0) && (terminator != NULL) && (strlen(terminator) > 0))
+ {
+ static const int BUF_UNIT = 256;
+ long long unit_count = 0;
+ long long term_len = strlen(terminator);
+ long long offset = 0;
+ bool done = false;
+ while (true)
+ {
+ // バッファ確保
+ if (offset == (unit_count * BUF_UNIT))
+ {
+ ++unit_count;
+ char *newbuf = (char *)realloc(buf, (unit_count * BUF_UNIT));
+ if (newbuf == NULL)
+ {
+ if (buf != NULL)
+ {
+ free(buf);
+ buf = NULL;
+ printf("realloc ng.\n");
+ }
+ break;
+ }
+ buf = newbuf;
+ }
+
+ if (done)
+ {
+ buf[offset] = '\0';
+ break;
+ }
+
+ // 1文字読み込み
+ int len = recv(socket, &buf[offset], 1, 0);
+ if (len <= 0)
+ {
+ if (offset == 0)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ if (len < 0)
+ {
+ printf("recv error.\n");
+ }
+ break;
+ }
+ if (offset >= (term_len - 1))
+ {
+ if (memcmp(&buf[offset - term_len + 1], terminator, term_len) == 0)
+ {
+ done = true;
+ }
+ }
+ ++offset;
+ }
+ }
+ return buf;
+}
+
+#ifdef _WIN32
+static HTTPURLResponse *receiveHTTPURLResponse(SOCKET socket, URL *url)
+#else
+static HTTPURLResponse *receiveHTTPURLResponse(int socket, URL *url)
+#endif
+{
+ HTTPURLResponse *result = NULL;
+
+ if (socket >= 0)
+ {
+ // Status Line の読み込み
+ char *statusLine;
+ while (true)
+ {
+ statusLine = readLine(socket, "\r\n");
+ if (statusLine == NULL)
+ {
+ DebugLog3("error: read status line.\n");
+ return NULL;
+ }
+ if (strlen(statusLine) > 0)
+ {
+ break;
+ }
+
+ DebugLog3("error: read status line. (retry)\n");
+ free(statusLine);
+ statusLine = NULL;
+ }
+
+ char *p = strchr(statusLine, ' ');
+ if ((p == NULL) || ((strncmp("HTTP/1.0 ", statusLine, 9) != 0) && (strncmp("HTTP/1.1 ", statusLine, 9) != 0)))
+ {
+ DebugLog3("error: invalid format. (HTTP-Version) \"%s\"\n", statusLine);
+ free(statusLine);
+ return NULL;
+ }
+ *p = '\0';
+
+ String *http_version = String::stringWithUTF8String(statusLine);
+
+ char *code = p + 1;
+ p = strchr(code, ' ');
+ if (p == NULL)
+ {
+ DebugLog3("error: invalid format. (Status-Code) \"%s\"\n", statusLine);
+ free(statusLine);
+ return NULL;
+ }
+ *p = '\0';
+
+ int status_code = atoi(code);
+ char tmp[256];
+#ifdef _WIN32
+ sprintf_s(tmp, sizeof(tmp), "%d", status_code);
+#else
+ sprintf(tmp, "%d", status_code);
+#endif
+ if (strcmp(code, tmp) != 0)
+ {
+ DebugLog3("error: invalid format. (Status-Code) \"%s\"\n", statusLine);
+ free(statusLine);
+ return NULL;
+ }
+
+ char *reason = p + 1;
+ p = strstr(reason, "\r\n");
+ if (p == NULL)
+ {
+ DebugLog3("error: invalid format. (Reason-Phrase) \"%s\"\n", statusLine);
+ free(statusLine);
+ return NULL;
+ }
+ *p = '\0';
+
+ String *reason_phrase = String::stringWithUTF8String(reason);
+
+ free(statusLine);
+
+ DebugLog3("status line: %s %d %s\n", http_version->cString(), status_code, reason_phrase->cString());
+
+ Dictionary *headers = Dictionary::dictionaryWithCapacity(0);
+
+ if (http_version->isEqualToString("HTTP/1.1"))
+ {
+ // ヘッダ読み込み
+ while (true)
+ {
+ char *header_line = readLine(socket, "\r\n");
+ if (header_line == NULL)
+ {
+ break;
+ }
+ if (strcmp("\r\n", header_line) == 0)
+ {
+ free(header_line);
+ break;
+ }
+
+ char *p = strchr(header_line, ':');
+ if (p != NULL)
+ {
+ *p = '\0';
+ char *value = p + 1;
+ while (*value == ' ')
+ {
+ ++value;
+ }
+ p = strstr(value, "\r\n");
+ *p = '\0';
+ headers->setString(value, header_line);
+ DebugLog3("%s: %s\n", header_line, value);
+ }
+
+ free(header_line);
+ }
+ }
+ else
+ {
+ }
+ result = HTTPURLResponse::alloc()->initWithURL(url, status_code, http_version, headers);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ }
+ return result;
+}
+
+#ifdef _WIN32
+static Data *receiveData(SOCKET socket, long long expectedContentLength)
+#else
+static Data *receiveData(int socket, long long expectedContentLength)
+#endif
+{
+ DebugLog2("receiveData(%d, %lld)\n", socket, expectedContentLength);
+
+ Data *result = NULL;
+
+ char *buf = NULL;
+ if (socket >= 0)
+ {
+ static const int BUF_UNIT = 1024;
+ long long unit_count = 0;
+
+ long long offset = 0;
+ while (true)
+ {
+ // バッファ確保
+ if (offset == (unit_count * BUF_UNIT))
+ {
+ ++unit_count;
+ char *newbuf = (char *)realloc(buf, (unit_count * BUF_UNIT));
+ if (newbuf == NULL)
+ {
+ if (buf != NULL)
+ {
+ free(buf);
+ buf = NULL;
+ }
+ break;
+ }
+ buf = newbuf;
+ }
+
+ // 読み込み
+ int rdlen;
+ if (expectedContentLength == URLResponseUnknownLength)
+ {
+ rdlen = BUF_UNIT;
+ }
+ else if ((expectedContentLength - offset) > BUF_UNIT)
+ {
+ rdlen = BUF_UNIT;
+ }
+ else
+ {
+ rdlen = (expectedContentLength - offset);
+ }
+ size_t len = recv(socket, &buf[offset], rdlen, 0);
+ if (len == 0)
+ {
+ // 終端 or エラー
+ break;
+ }
+
+ offset += len;
+
+ if (expectedContentLength != URLResponseUnknownLength)
+ {
+ if (len != rdlen)
+ {
+ // 終端 or エラー
+ break;
+ }
+ if (offset >= expectedContentLength)
+ {
+ break;
+ }
+ }
+ }
+ if (buf != NULL)
+ {
+ result = Data::alloc()->initWithBytesAndLength(buf, offset);
+ free(buf);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ }
+ }
+ return result;
+}
+
+Data *URLConnection::sendSynchronousRequest(URLRequest *request, URLResponse **response, Error **error)
+{
+ DebugLog2("URLConnection::sendSynchronousRequest()\n");
+
+ //
+ // 現状は、更なるクラス群を調査する気力が無いので
+ // socketで直接実装する
+ // とりあえず linux socket で実装。あとでwinsockに対応
+ //
+
+ Data *result = NULL;
+ if (request != NULL)
+ {
+ URL *url = request->url();
+ if (url->scheme()->isEqualToString("http"))
+ {
+ // http のみ実装
+ struct sockaddr_in dst_addr;
+ dst_addr.sin_family = AF_INET;
+ dst_addr.sin_port = htons(url->port());
+ struct hostent *hostent = gethostbyname(url->host()->cString());
+ if (hostent == NULL)
+ {
+ DebugLog3("error: gethostbyname().\n");
+ return NULL;
+ }
+#ifdef _WIN32
+ dst_addr.sin_addr.s_addr = *(unsigned int *)hostent->h_addr;
+#else
+ dst_addr.sin_addr.s_addr = *(uint32_t *)hostent->h_addr;
+#endif
+
+#ifdef _WIN32
+// WSADATA wsaData;
+// WSAStartup(MAKEWORD(2,0), &wsaData);
+ SOCKET sock = INVALID_SOCKET;
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock == INVALID_SOCKET)
+#else
+ int sock;
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock == -1)
+#endif
+ {
+ DebugLog3("error: socket()\n");
+ return NULL;
+ }
+
+ if (connect(sock, (const struct sockaddr *)&dst_addr, sizeof(dst_addr)) != 0)
+ {
+ DebugLog3("error: connect()\n");
+#ifdef _WIN32
+ closesocket(sock);
+// WSACleanup();
+#else
+ close(sock);
+#endif
+ return NULL;
+ }
+
+ String *reqmsg = String::string();
+
+ // Request Line
+ String *reqline = String::stringWithFormat("%s %s HTTP/1.1\r\n", request->HTTPMethod()->cString(), url->path()->cString());
+ reqmsg = reqmsg->stringByAppendingString(reqline);
+
+ // headers
+ Dictionary *headers = request->allHTTPHeaderFields();
+ Array *keys = headers->allKeys();
+ for (UInteger i = 0; i < keys->count(); ++i)
+ {
+ String *key = (String *)keys->objectAtIndex(i);
+ String *val = headers->stringForKey(key);
+ String *tmp = String::stringWithFormat("%s: %s\r\n", key->cString(), val->cString());
+ reqmsg = reqmsg->stringByAppendingString(tmp);
+ }
+
+ reqmsg = reqmsg->stringByAppendingString("\r\n");
+ DebugLog3("requst:\n%s", reqmsg->cString());
+
+#ifdef _WIN32
+ if (send(sock, reqmsg->cString(), reqmsg->length(), 0) != reqmsg->length())
+#else
+ if (write(sock, reqmsg->cString(), reqmsg->length()) != reqmsg->length())
+#endif
+ {
+ DebugLog3("error: write()\n");
+#ifdef _WIN32
+ closesocket(sock);
+// WSACleanup();
+#else
+ close(sock);
+#endif
+ return NULL;
+ }
+
+ DebugLog3("resp wait...\n");
+
+ //
+ HTTPURLResponse *resp = receiveHTTPURLResponse(sock, url);
+ if (resp == NULL)
+ {
+ DebugLog3("error: receiveHTTPURLResponse()\n");
+#ifdef _WIN32
+ closesocket(sock);
+// WSACleanup();
+#else
+ close(sock);
+#endif
+ return NULL;
+ }
+
+ if (resp->statusCode() == 200)
+ {
+ DebugLog3("data wait...\n");
+ result = receiveData(sock, resp->expectedContentLength());
+ if (result != NULL)
+ {
+ DebugLog3("recv data length: %llu\n", result->length());
+ if (response != NULL)
+ {
+ *response = resp;
+ }
+ }
+ }
+
+#ifdef _WIN32
+ closesocket(sock);
+// WSACleanup();
+#else
+ close(sock);
+#endif
+ }
+ else
+ {
+ DebugLog0("not implemented.\n");
+ }
+ }
+ return result;
+}
+
+const char *URLConnection::className()
+{
+ return "URLConnection";
+}
+
+} // Raym
--- /dev/null
+//
+// URLConnection.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/Data.h>
+#include <Raym/URLRequest.h>
+#include <Raym/URLResponse.h>
+#include <Raym/Error.h>
+
+namespace Raym
+{
+
+class URLConnection;
+
+class URLConnectionDelegate
+{
+public:
+ virtual bool connectionShouldUseCredentialStorage(URLConnection *connection);
+};
+
+class URLConnection : public Object
+{
+protected:
+ URLConnection();
+ ~URLConnection();
+
+public:
+ static URLConnection *alloc();
+ URLConnection *initWithRequest(URLRequest *request, URLConnectionDelegate *delegate);
+
+ virtual const char *className();
+
+ static Data *sendSynchronousRequest(URLRequest *request, URLResponse **response, Error **error);
+};
+
+} // Raym
--- /dev/null
+//
+// URLRequest.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/URLRequest.h>
+
+namespace Raym
+{
+
+#define RELEASE(P1) \
+ if ((P1) != NULL) \
+ { \
+ (P1)->release(); \
+ (P1) = NULL; \
+ }
+
+URLRequest::URLRequest()
+{
+ DebugLog2("URLRequest::URLRequest()\n");
+
+ _url = NULL;
+ _HTTPMethod = NULL;
+ _HTTPHeaderFields = NULL;
+}
+
+URLRequest::~URLRequest()
+{
+ DebugLog2("URLRequest::~URLRequest()\n");
+
+ RELEASE(_url);
+ RELEASE(_HTTPMethod);
+ RELEASE(_HTTPHeaderFields);
+}
+
+URLRequest *URLRequest::alloc()
+{
+ DebugLog2("URLRequest::alloc()\n");
+
+ return new URLRequest();
+}
+
+URLRequest *URLRequest::requestWithURL(URL *theURL)
+{
+ DebugLog2("URLRequest::requestWithURL()\n");
+
+ URLRequest *result = URLRequest::alloc()->initWithURL(theURL);
+ if (result != NULL)
+ {
+ result->autorelease();
+ }
+ return result;
+}
+
+URLRequest *URLRequest::initWithURL(URL *theURL)
+{
+ DebugLog2("URLRequest::initWithURL()\n");
+
+ if (theURL != NULL)
+ {
+ _url = theURL;
+ _url->retain();
+ if (_url->scheme()->isEqualToString("http"))
+ {
+ _HTTPMethod = String::alloc()->initWithUTF8String("GET");
+ _HTTPHeaderFields = Dictionary::alloc()->initWithCapacity(0);
+ _HTTPHeaderFields->setString(_url->host(), "Host");
+ _HTTPHeaderFields->setString("close", "Connection");
+ _HTTPHeaderFields->setString("Mozilla/5.0 AppleWebKit/600.1.1.7", "User-Agent");
+ _HTTPHeaderFields->setString("*/*", "Accept");
+ if (_url->password() != NULL)
+ {
+ String *credentials = String::stringWithFormat("%s:%s", ((_url->user() == NULL) ? "" : _url->user()->cString()), _url->password()->cString());
+ String *value = String::stringWithFormat("Basic %s", String::base64StringWithBytes(credentials->cString(), credentials->length())->cString());
+ _HTTPHeaderFields->setString(value, "Authorization");
+ }
+ }
+ }
+ else
+ {
+ DebugLog0("warnning: theURL is NULL\n");
+ return NULL;
+ }
+
+ return this;
+}
+
+String *URLRequest::HTTPMethod()
+{
+ return _HTTPMethod;
+}
+
+URL *URLRequest::url()
+{
+ return _url;
+}
+Dictionary *URLRequest::allHTTPHeaderFields()
+{
+ return _HTTPHeaderFields;
+}
+
+void URLRequest::addValueForHTTPHeaderField(const char *value, const char *field)
+{
+ if ((value != NULL) && (field != NULL))
+ {
+ _HTTPHeaderFields->setString(value, field);
+ }
+}
+
+const char *URLRequest::className()
+{
+ return "URLRequest";
+}
+
+} // Raym
--- /dev/null
+//
+// URLRequest.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/Dictionary.h>
+#include <Raym/URL.h>
+
+namespace Raym
+{
+
+class URLRequest : public Object
+{
+protected:
+ URLRequest();
+ ~URLRequest();
+
+ URL * _url;
+ String * _HTTPMethod;
+ Dictionary * _HTTPHeaderFields;
+
+public:
+ static URLRequest *alloc();
+ static URLRequest *requestWithURL(URL *theURL);
+
+ URLRequest *initWithURL(URL *theURL);
+
+ Dictionary *allHTTPHeaderFields();
+ String *HTTPMethod();
+ URL *url();
+
+ // for Mutable Class's Method
+ void addValueForHTTPHeaderField(const char *value, const char *field);
+
+
+// virtual String *description();
+ virtual const char *className();
+};
+
+} // Raym
--- /dev/null
+//
+// URLResponse.cpp
+//
+
+#define DBG_LEVEL 0
+#include <Raym/Log.h>
+#include <Raym/URLResponse.h>
+
+namespace Raym
+{
+
+#define RELEASE(P1) \
+ if ((P1) != NULL) \
+ { \
+ (P1)->release(); \
+ (P1) = NULL; \
+ }
+
+URLResponse::URLResponse()
+{
+ DebugLog2("URLResponse::URLResponse()\n");
+
+ _URL = NULL;
+ _MIMEType = NULL;
+ _expectedContentLength = URLResponseUnknownLength;
+ _textEncodingName = NULL;
+}
+
+URLResponse::~URLResponse()
+{
+ DebugLog2("URLResponse::~URLResponse()\n");
+
+ RELEASE(_URL);
+ RELEASE(_MIMEType);
+ _expectedContentLength = URLResponseUnknownLength;
+ RELEASE(_textEncodingName);
+}
+
+URLResponse *URLResponse::alloc()
+{
+ DebugLog2("URLResponse::alloc()\n");
+
+ return new URLResponse();
+}
+
+URLResponse *URLResponse::initWithURL(URL *URL, String *MIMEType, long long expectedContentLength, String *textEncodingName)
+{
+ DebugLog2("URLResponse::initWithURL()\n");
+
+ if ((URL == NULL) || (MIMEType == NULL) || ((expectedContentLength < 0) && (expectedContentLength != URLResponseUnknownLength)) || (textEncodingName == NULL))
+ {
+ DebugLog3("error: parameter check NG.\n");
+ return NULL;
+ }
+
+ _URL = URL;
+ _URL->retain();
+ _MIMEType = MIMEType;
+ _MIMEType->retain();
+ _expectedContentLength = expectedContentLength;
+ _textEncodingName = textEncodingName;
+ _textEncodingName->retain();
+
+ DebugLog3("URLResponse::initWithURL() %016x %016x %016x\n", _URL, _MIMEType, _textEncodingName);
+
+ return this;
+}
+
+String *URLResponse::MIMEType()
+{
+ DebugLog2("URLResponse::MIMEType()\n");
+
+ return _MIMEType;
+}
+
+String *URLResponse::suggestedFilename()
+{
+ DebugLog2("URLResponse::suggestedFilename()\n");
+
+ return NULL;
+}
+
+String *URLResponse::textEncodingName()
+{
+ DebugLog2("URLResponse::textEncodingName()\n");
+
+ return _textEncodingName;
+}
+
+URL *URLResponse::url()
+{
+ DebugLog2("URLResponse::url()\n");
+
+ return _URL;
+}
+
+long long URLResponse::expectedContentLength()
+{
+ DebugLog2("URLResponse::expectedContentLength()\n");
+
+ return _expectedContentLength;
+}
+
+const char *URLResponse::className()
+{
+ return "URLResponse";
+}
+
+} // Raym
--- /dev/null
+//
+// URLResponse.h
+//
+
+#pragma once
+
+#include <Raym/Object.h>
+#include <Raym/URL.h>
+
+namespace Raym
+{
+
+#define URLResponseUnknownLength ((long long)-1)
+
+class URLResponse : public Object
+{
+protected:
+ URLResponse();
+ ~URLResponse();
+
+ URL * _URL;
+ String * _MIMEType;
+ long long _expectedContentLength;
+ String * _textEncodingName;
+
+public:
+ static URLResponse *alloc();
+
+ URLResponse *initWithURL(URL *URL, String *MIMEType, long long expectedContentLength, String *textEncodingName);
+ String *MIMEType();
+ String *suggestedFilename();
+ String *textEncodingName();
+ URL *url();
+ long long expectedContentLength();
+
+// virtual String *description();
+ virtual const char *className();
+};
+
+} // Raym
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include <Raym/Raym.h>\r
+\r
+#include <windows.h>\r
+#include <tlhelp32.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+DEFINE_STATIC_MUTEX(mutex_);\r
+\r
+static Workspace *sharedWorkspace_ = NULL;\r
+\r
+Workspace::Workspace()\r
+{\r
+ DebugLog2("Workspace::Workspace()");\r
+}\r
+\r
+Workspace::~Workspace()\r
+{\r
+ DebugLog2("Workspace::~Workspace()");\r
+}\r
+\r
+Workspace *Workspace::sharedWorkspace()\r
+{\r
+ mutex_.lock();\r
+\r
+ if (sharedWorkspace_ == NULL)\r
+ {\r
+ sharedWorkspace_ = new Workspace();\r
+ sharedWorkspace_->init()->autorelease(true);\r
+ }\r
+\r
+ mutex_.unlock();\r
+\r
+ return sharedWorkspace_;\r
+}\r
+\r
+Array *Workspace::runningApplications()\r
+{\r
+ DebugLog2("Workspace::runningApplications()");\r
+\r
+ Array *result = Array::arrayWithCapacity(0);\r
+\r
+ Dictionary *tmpDict1 = Dictionary::dictionaryWithCapacity(0);\r
+\r
+ //\r
+ // 1回目:通常アプリ\r
+ //\r
+\r
+ // パイプ生成\r
+ Pipe *pipe = Pipe::alloc()->init();\r
+\r
+ // タスク生成\r
+ Task *task = Task::alloc()->init();\r
+ task->setLaunchPath(String::stringWithUTF8String("tasklist"));\r
+\r
+ // 引数設定\r
+ Array *args = Array::arrayWithCapacity(0);\r
+ args->addObject(String::stringWithUTF8String("/v"));\r
+ args->addObject(String::stringWithUTF8String("/fo"));\r
+ args->addObject(String::stringWithUTF8String("csv"));\r
+ task->setArguments(args);\r
+\r
+ // 標準出力設定\r
+ task->setStandardOutput(pipe->fileHandleForWriting());\r
+ //task->setStandardError(pipe->fileHandleForWriting());\r
+\r
+ // タスク実行\r
+ task->launch();\r
+\r
+ // 読み込み\r
+ FileInputStream *fis = FileInputStream::fileInputStream(pipe->fileHandleForReading());\r
+\r
+ bool header = true;\r
+ while (true)\r
+ {\r
+ String *line = fis->readLine();\r
+ if (line == NULL)\r
+ {\r
+ break;\r
+ }\r
+ if (header)\r
+ {\r
+ // 1行目はヘッダ\r
+ header = false;\r
+ }\r
+ else\r
+ {\r
+ // 2行目以降\r
+ Array *list = line->componentsSeparatedByString("\",\"");\r
+ if ((list != NULL) && (list->count() == 9))\r
+ {\r
+ // RunningApplication用の情報を収集\r
+ Dictionary *tmpDict2 = Dictionary::dictionaryWithCapacity(0);\r
+ tmpDict2->setString(((String *)list->objectAtIndex(0))->substringFromIndex(1), RunningApplication::KEY_IMAGE);\r
+ tmpDict2->setObject(list->objectAtIndex(4), RunningApplication::KEY_MEMORY);\r
+ tmpDict2->setObject(list->objectAtIndex(5), RunningApplication::KEY_STATUS);\r
+ tmpDict2->setObject(list->objectAtIndex(6), RunningApplication::KEY_USER);\r
+ tmpDict2->setObject(list->objectAtIndex(7), RunningApplication::KEY_CPU);\r
+\r
+ // PIDをキーにして保持\r
+ tmpDict1->setObject(tmpDict2, (String *)list->objectAtIndex(1));\r
+ }\r
+ }\r
+ }\r
+\r
+ // タスク終了\r
+ task->terminate();\r
+ task->release();\r
+\r
+ // パイプ破棄\r
+ pipe->release();\r
+\r
+ //\r
+ // 2回目:ストアアプリ\r
+ //\r
+\r
+ // パイプ生成\r
+ pipe = Pipe::alloc()->init();\r
+\r
+ // タスク生成\r
+ task = Task::alloc()->init();\r
+ task->setLaunchPath(String::stringWithUTF8String("tasklist"));\r
+\r
+ // 引数設定\r
+ args = Array::arrayWithCapacity(0);\r
+ args->addObject(String::stringWithUTF8String("/v"));\r
+ args->addObject(String::stringWithUTF8String("/fo"));\r
+ args->addObject(String::stringWithUTF8String("csv"));\r
+ args->addObject(String::stringWithUTF8String("/apps"));\r
+ task->setArguments(args);\r
+\r
+ // 標準出力設定\r
+ task->setStandardOutput(pipe->fileHandleForWriting());\r
+ //task->setStandardError(pipe->fileHandleForWriting());\r
+\r
+ // タスク実行\r
+ task->launch();\r
+\r
+ // 読み込み\r
+ fis = FileInputStream::fileInputStream(pipe->fileHandleForReading());\r
+\r
+ header = true;\r
+ while (true)\r
+ {\r
+ String *line = fis->readLine();\r
+ if (line == NULL)\r
+ {\r
+ break;\r
+ }\r
+ if (header)\r
+ {\r
+ // 1行目はヘッダ\r
+ header = false;\r
+ }\r
+ else\r
+ {\r
+ // 2行目以降\r
+\r
+ Array *list = line->componentsSeparatedByString("\",\"");\r
+ if ((list != NULL) && (list->count() == 10))\r
+ {\r
+ Dictionary *tmpDict2 = tmpDict1->dictionaryForKey((String *)list->objectAtIndex(1));\r
+ if (tmpDict2 != NULL)\r
+ {\r
+ // 同一PIDがある場合\r
+\r
+ // ステータスを更新\r
+ if (!((String *)list->objectAtIndex(5))->isEqualToString("Running"))\r
+ {\r
+ tmpDict2->setString("Interrupted", RunningApplication::KEY_STATUS);\r
+ }\r
+\r
+ // パッケージを追加\r
+ String *tmpStr = (String *)list->objectAtIndex(9);\r
+ tmpDict2->setString(tmpStr->substringToIndex(tmpStr->length() - 1), RunningApplication::KEY_PACKAGE);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // タスク終了\r
+ task->terminate();\r
+ task->release();\r
+\r
+ // パイプ破棄\r
+ pipe->release();\r
+\r
+ Array *keys = tmpDict1->allKeys();\r
+ for (uint idx = 0; idx < keys->count(); ++idx)\r
+ {\r
+ int pid = ((String *)keys->objectAtIndex(idx))->intValue();\r
+ Dictionary *tmpDict2 = tmpDict1->dictionaryForKey((String *)keys->objectAtIndex(idx));\r
+\r
+ RunningApplication *ra = RunningApplication::alloc()->initWithPID(pid, tmpDict2);\r
+ result->addObject(ra);\r
+ ra->release();\r
+ }\r
+ return result;\r
+}\r
+\r
+const char *Workspace::className()\r
+{\r
+ return "Workspace";\r
+}\r
+\r
+} // Raym\r
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Object.h>\r
+#include <Raym/Array.h>\r
+\r
+namespace Raym\r
+{\r
+\r
+class Workspace : public Object\r
+{\r
+protected:\r
+ Workspace();\r
+ ~Workspace();\r
+\r
+public:\r
+ static Workspace *sharedWorkspace();\r
+\r
+ Array *runningApplications();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // Raym\r
+\r
--- /dev/null
+#ifndef ARIB_STD_B25_H
+#define ARIB_STD_B25_H
+
+#include "portable.h"
+#include "b_cas_card.h"
+
+typedef struct {
+ uint8_t *data;
+ int32_t size;
+} ARIB_STD_B25_BUFFER;
+
+typedef struct {
+
+ int32_t program_number; /* channel */
+
+ int32_t ecm_unpurchased_count;
+ int32_t last_ecm_error_code;
+
+ int32_t padding;
+
+ int64_t total_packet_count;
+ int64_t undecrypted_packet_count;
+
+} ARIB_STD_B25_PROGRAM_INFO;
+
+typedef struct {
+
+ void *private_data;
+
+ void (* release)(void *std_b25);
+
+ int (* set_multi2_round)(void *std_b25, int32_t round);
+ int (* set_strip)(void *std_b25, int32_t strip);
+ int (* set_emm_proc)(void *std_b25, int32_t on);
+
+ int (* set_b_cas_card)(void *std_b25, B_CAS_CARD *bcas);
+
+ int (* reset)(void *std_b25);
+ int (* flush)(void *std_b25);
+
+ int (* put)(void *std_b25, ARIB_STD_B25_BUFFER *buf);
+ int (* get)(void *std_b25, ARIB_STD_B25_BUFFER *buf);
+
+ int (* get_program_count)(void *std_b25);
+ int (* get_program_info)(void *std_b25, ARIB_STD_B25_PROGRAM_INFO *info, int32_t idx);
+
+} ARIB_STD_B25;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern ARIB_STD_B25 *create_arib_std_b25();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ARIB_STD_B25_H */
+
--- /dev/null
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+//#include <iconv.h>\r
+\r
+#undef _UNICODE\r
+#include "aribstr.h"\r
+\r
+#define CODE_UNKNOWN 0 // 不明なグラフィックセット(非対応)\r
+#define CODE_KANJI 1 // Kanji\r
+#define CODE_ALPHANUMERIC 2 // Alphanumeric\r
+#define CODE_HIRAGANA 3 // Hiragana\r
+#define CODE_KATAKANA 4 // Katakana\r
+#define CODE_MOSAIC_A 5 // Mosaic A\r
+#define CODE_MOSAIC_B 6 // Mosaic B\r
+#define CODE_MOSAIC_C 7 // Mosaic C\r
+#define CODE_MOSAIC_D 8 // Mosaic D\r
+#define CODE_PROP_ALPHANUMERIC 9 // Proportional Alphanumeric\r
+#define CODE_PROP_HIRAGANA 10 // Proportional Hiragana\r
+#define CODE_PROP_KATAKANA 11 // Proportional Katakana\r
+#define CODE_JIS_X0201_KATAKANA 12 // JIS X 0201 Katakana\r
+#define CODE_JIS_KANJI_PLANE_1 13 // JIS compatible Kanji Plane 1\r
+#define CODE_JIS_KANJI_PLANE_2 14 // JIS compatible Kanji Plane 2\r
+#define CODE_ADDITIONAL_SYMBOLS 15 // Additional symbols\r
+\r
+\r
+#define TCHAR char\r
+#define BYTE char\r
+#define WORD int\r
+#define DWORD int\r
+#define bool int\r
+#define true 1\r
+#define false 0\r
+#define TEXT(a) a\r
+#define _T(a) a\r
+#define CODE_SET int\r
+\r
+static int m_CodeG[4];\r
+static int *m_pLockingGL;\r
+static int *m_pLockingGR;\r
+static int *m_pSingleGL;\r
+ \r
+static BYTE m_byEscSeqCount;\r
+static BYTE m_byEscSeqIndex;\r
+static bool m_bIsEscSeqDrcs;\r
+\r
+\r
+static const DWORD AribToStringInternal(TCHAR *lpszDst, const BYTE *pSrcData, const DWORD dwSrcLen);\r
+static const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet);\r
+\r
+static const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode);\r
+static const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode);\r
+static const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode);\r
+static const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode);\r
+static const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode);\r
+static const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode);\r
+\r
+static void ProcessEscapeSeq(const BYTE byCode);\r
+\r
+static void LockingShiftGL(const BYTE byIndexG);\r
+static void LockingShiftGR(const BYTE byIndexG);\r
+static void SingleShiftGL(const BYTE byIndexG);\r
+\r
+static const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode);\r
+static const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode);\r
+\r
+static WORD convertjis(DWORD);\r
+\r
+static const bool abCharSizeTable[] =\r
+{\r
+ false, // CODE_UNKNOWN 不明なグラフィックセット(非対応)\r
+ true, // CODE_KANJI Kanji\r
+ false, // CODE_ALPHANUMERIC Alphanumeric\r
+ false, // CODE_HIRAGANA Hiragana\r
+ false, // CODE_KATAKANA Katakana\r
+ false, // CODE_MOSAIC_A Mosaic A\r
+ false, // CODE_MOSAIC_B Mosaic B\r
+ false, // CODE_MOSAIC_C Mosaic C\r
+ false, // CODE_MOSAIC_D Mosaic D\r
+ false, // CODE_PROP_ALPHANUMERIC Proportional Alphanumeric\r
+ false, // CODE_PROP_HIRAGANA Proportional Hiragana\r
+ false, // CODE_PROP_KATAKANA Proportional Katakana\r
+ false, // CODE_JIS_X0201_KATAKANA JIS X 0201 Katakana\r
+ true, // CODE_JIS_KANJI_PLANE_1 JIS compatible Kanji Plane 1\r
+ true, // CODE_JIS_KANJI_PLANE_2 JIS compatible Kanji Plane 2\r
+ true // CODE_ADDITIONAL_SYMBOLS Additional symbols\r
+};\r
+\r
+int AribToString(\r
+ char *lpszDst, \r
+ const char *pSrcData, \r
+ const int dwSrcLen) {\r
+ \r
+ return AribToStringInternal(lpszDst, pSrcData, dwSrcLen);\r
+}\r
+\r
+const DWORD AribToStringInternal(TCHAR *lpszDst,\r
+ const BYTE *pSrcData, const DWORD dwSrcLen)\r
+{\r
+ if(!pSrcData || !dwSrcLen || !lpszDst)return 0UL;\r
+ \r
+ DWORD dwSrcPos = 0UL;\r
+ DWORD dwDstLen = 0UL;\r
+ int dwSrcData;\r
+ \r
+ // 状態初期設定\r
+ m_byEscSeqCount = 0U;\r
+ m_pSingleGL = NULL;\r
+\r
+ m_CodeG[0] = CODE_KANJI;\r
+ m_CodeG[1] = CODE_ALPHANUMERIC;\r
+ m_CodeG[2] = CODE_HIRAGANA;\r
+ m_CodeG[3] = CODE_KATAKANA;\r
+\r
+ m_pLockingGL = &m_CodeG[0];\r
+ m_pLockingGR = &m_CodeG[2];\r
+\r
+ while(dwSrcPos < dwSrcLen){\r
+ dwSrcData = pSrcData[dwSrcPos] & 0xFF;\r
+\r
+ if(!m_byEscSeqCount){\r
+ \r
+ // GL/GR領域\r
+ if((dwSrcData >= 0x21U) && (dwSrcData <= 0x7EU)){\r
+ // GL領域\r
+ const CODE_SET CurCodeSet = (m_pSingleGL)? *m_pSingleGL : *m_pLockingGL;\r
+ m_pSingleGL = NULL;\r
+ \r
+ if(abCharSizeTable[CurCodeSet]){\r
+ // 2バイトコード\r
+ if((dwSrcLen - dwSrcPos) < 2UL)break;\r
+ \r
+ dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)pSrcData[dwSrcPos + 0] << 8) | (WORD)pSrcData[dwSrcPos + 1], CurCodeSet);\r
+ dwSrcPos++;\r
+ }\r
+ else{\r
+ // 1バイトコード\r
+ dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)dwSrcData, CurCodeSet);\r
+ }\r
+ }\r
+ else if((dwSrcData >= 0xA1U) && (dwSrcData <= 0xFEU)){\r
+ // GR領域\r
+ const CODE_SET CurCodeSet = *m_pLockingGR;\r
+ \r
+ if(abCharSizeTable[CurCodeSet]){\r
+ // 2バイトコード\r
+ if((dwSrcLen - dwSrcPos) < 2UL)break;\r
+ \r
+ dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)(pSrcData[dwSrcPos + 0] & 0x7FU) << 8) | (WORD)(pSrcData[dwSrcPos + 1] & 0x7FU), CurCodeSet);\r
+ dwSrcPos++;\r
+ }\r
+ else{\r
+ // 1バイトコード\r
+ dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)(dwSrcData & 0x7FU), CurCodeSet);\r
+ }\r
+ }\r
+ else{\r
+ // 制御コード\r
+ switch(dwSrcData){\r
+ case 0x0FU : LockingShiftGL(0U); break; // LS0\r
+ case 0x0EU : LockingShiftGL(1U); break; // LS1\r
+ case 0x19U : SingleShiftGL(2U); break; // SS2\r
+ case 0x1DU : SingleShiftGL(3U); break; // SS3\r
+ case 0x1BU : m_byEscSeqCount = 1U; break; // ESC\r
+ case 0x20U :\r
+ case 0xA0U : lpszDst[dwDstLen++] = TEXT(' '); break; // SP\r
+ default : break; // 非対応\r
+ }\r
+ }\r
+ }\r
+ else{\r
+ // エスケープシーケンス処理\r
+ ProcessEscapeSeq(dwSrcData);\r
+ }\r
+ \r
+ dwSrcPos++;\r
+ }\r
+\r
+ // 終端文字\r
+ lpszDst[dwDstLen] = TEXT('\0');\r
+\r
+ return dwDstLen;\r
+}\r
+\r
+const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet)\r
+{\r
+ switch(CodeSet){\r
+ case CODE_KANJI :\r
+ case CODE_JIS_KANJI_PLANE_1 :\r
+ case CODE_JIS_KANJI_PLANE_2 :\r
+ // 漢字コード出力\r
+ return PutKanjiChar(lpszDst, wCode);\r
+\r
+ case CODE_ALPHANUMERIC :\r
+ case CODE_PROP_ALPHANUMERIC :\r
+ // 英数字コード出力\r
+ return PutAlphanumericChar(lpszDst, wCode);\r
+\r
+ case CODE_HIRAGANA :\r
+ case CODE_PROP_HIRAGANA :\r
+ // ひらがなコード出力\r
+ return PutHiraganaChar(lpszDst, wCode);\r
+\r
+ case CODE_PROP_KATAKANA :\r
+ case CODE_KATAKANA :\r
+ // カタカナコード出力\r
+ return PutKatakanaChar(lpszDst, wCode);\r
+\r
+ case CODE_JIS_X0201_KATAKANA :\r
+ // JISカタカナコード出力\r
+ return PutJisKatakanaChar(lpszDst, wCode);\r
+#if 1\r
+ case CODE_ADDITIONAL_SYMBOLS :\r
+ // 追加シンボルコード出力\r
+ return PutSymbolsChar(lpszDst, wCode);\r
+#endif\r
+ default :\r
+ return 0UL;\r
+ }\r
+}\r
+\r
+const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // JIS→Shift-JIS漢字コード変換\r
+ const WORD wShiftJIS = convertjis(wCode);\r
+\r
+#ifdef _UNICODE\r
+ // Shift-JIS → UNICODE\r
+ const char szShiftJIS[3] = {(char)(wShiftJIS >> 8), (char)(wShiftJIS & 0x00FFU), '\0'};\r
+ ::MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, szShiftJIS, 2, lpszDst, 2);\r
+\r
+ return 1UL;\r
+#else\r
+ // Shift-JIS → Shift-JIS\r
+ lpszDst[0] = (wShiftJIS >> 8) & 0xFF;\r
+ lpszDst[1] = (char)(wShiftJIS & 0x00FFU);\r
+ \r
+ return 2UL;\r
+#endif\r
+}\r
+\r
+const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // 英数字文字コード変換\r
+ static const TCHAR *acAlphanumericTable = \r
+ TEXT(" ")\r
+ TEXT(" ")\r
+ TEXT(" !”#$%&’()*+,-./")\r
+ TEXT("0123456789:;<=>?")\r
+ TEXT("@ABCDEFGHIJKLMNO")\r
+ TEXT("PQRSTUVWXYZ[¥]^_")\r
+ TEXT(" abcdefghilklmno")\r
+ TEXT("pqrstuvwxyz{|} ̄ ");\r
+\r
+#ifdef _UNICODE\r
+ lpszDst[0] = acAlphanumericTable[wCode];\r
+\r
+ return 1UL;\r
+#else\r
+ lpszDst[0] = acAlphanumericTable[wCode * 2U + 0U];\r
+ lpszDst[1] = acAlphanumericTable[wCode * 2U + 1U];\r
+\r
+ return 2UL;\r
+#endif\r
+}\r
+\r
+const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // ひらがな文字コード変換\r
+ static const TCHAR *acHiraganaTable = \r
+ TEXT(" ")\r
+ TEXT(" ")\r
+ TEXT(" ぁあぃいぅうぇえぉおかがきぎく")\r
+ TEXT("ぐけげこごさざしじすずせぜそぞた")\r
+ TEXT("だちぢっつづてでとどなにぬねのは")\r
+ TEXT("ばぱひびぴふぶぷへべぺほぼぽまみ")\r
+ TEXT("むめもゃやゅゆょよらりるれろゎわ")\r
+ TEXT("ゐゑをん ゝゞー。「」、・ ");\r
+ \r
+#ifdef _UNICODE\r
+ lpszDst[0] = acHiraganaTable[wCode];\r
+\r
+ return 1UL;\r
+#else\r
+ lpszDst[0] = acHiraganaTable[wCode * 2U + 0U];\r
+ lpszDst[1] = acHiraganaTable[wCode * 2U + 1U];\r
+\r
+ return 2UL;\r
+#endif\r
+}\r
+\r
+const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // カタカナ英数字文字コード変換\r
+ static const TCHAR *acKatakanaTable = \r
+ TEXT(" ")\r
+ TEXT(" ")\r
+ TEXT(" ァアィイゥウェエォオカガキギク")\r
+ TEXT("グケゲコゴサザシジスズセゼソゾタ")\r
+ TEXT("ダチヂッツヅテデトドナニヌネノハ")\r
+ TEXT("バパヒビピフブプヘベペホボポマミ")\r
+ TEXT("ムメモャヤュユョヨラリルレロヮワ")\r
+ TEXT("ヰヱヲンヴヵヶヽヾー。「」、・ ");\r
+ \r
+#ifdef _UNICODE\r
+ lpszDst[0] = acKatakanaTable[wCode];\r
+\r
+ return 1UL;\r
+#else\r
+ lpszDst[0] = acKatakanaTable[wCode * 2U + 0U];\r
+ lpszDst[1] = acKatakanaTable[wCode * 2U + 1U];\r
+\r
+ return 2UL;\r
+#endif\r
+}\r
+\r
+const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // JISカタカナ文字コード変換\r
+ static const TCHAR *acJisKatakanaTable = \r
+ TEXT(" ")\r
+ TEXT(" ")\r
+ TEXT(" 。「」、・ヲァィゥェォャュョッ")\r
+ TEXT("ーアイウエオカキクケコサシスセソ")\r
+ TEXT("タチツテトナニヌネノハヒフヘホマ")\r
+ TEXT("ミムメモヤユヨラリルレロワン゛゜")\r
+ TEXT(" ")\r
+ TEXT(" ");\r
+ \r
+#ifdef _UNICODE\r
+ lpszDst[0] = acJisKatakanaTable[wCode];\r
+\r
+ return 1UL;\r
+#else\r
+ lpszDst[0] = acJisKatakanaTable[wCode * 2U + 0U];\r
+ lpszDst[1] = acJisKatakanaTable[wCode * 2U + 1U];\r
+\r
+ return 2UL;\r
+#endif\r
+}\r
+\r
+const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode)\r
+{\r
+ // 追加シンボル文字コード変換(とりあえず必要そうなものだけ)\r
+ static const TCHAR *aszSymbolsTable1[] =\r
+ {\r
+ _T("[HV]"), _T("[SD]"), _T("[P]"), _T("[W]"), _T("[MV]"), _T("[手]"), _T("[字]"), _T("[双]"), // 0x7A50 - 0x7A57 90/48 - 90/55\r
+ _T("[デ]"), _T("[S]"), _T("[二]"), _T("[多]"), _T("[解]"), _T("[SS]"), _T("[B]"), _T("[N]"), // 0x7A58 - 0x7A5F 90/56 - 90/63\r
+ _T("■"), _T("●"), _T("[天]"), _T("[交]"), _T("[映]"), _T("[無]"), _T("[料]"), _T("[年齢制限]"), // 0x7A60 - 0x7A67 90/64 - 90/71\r
+ _T("[前]"), _T("[後]"), _T("[再]"), _T("[新]"), _T("[初]"), _T("[終]"), _T("[生]"), _T("[販]"), // 0x7A68 - 0x7A6F 90/72 - 90/79\r
+ _T("[声]"), _T("[吹]"), _T("[PPV]"), _T("(秘)"), _T("ほか") // 0x7A70 - 0x7A74 90/80 - 90/84\r
+ };\r
+\r
+ static const TCHAR *aszSymbolsTable2[] =\r
+ {\r
+ _T("→"), _T("←"), _T("↑"), _T("↓"), _T("●"), _T("○"), _T("年"), _T("月"), // 0x7C21 - 0x7C28 92/01 - 92/08\r
+ _T("日"), _T("円"), _T("㎡"), _T("立方m"), _T("㎝"), _T("平方cm"), _T("立方㎝"), _T("0."), // 0x7C29 - 0x7C30 92/09 - 92/16\r
+ _T("1."), _T("2."), _T("3."), _T("4."), _T("5."), _T("6."), _T("7."), _T("8."), // 0x7C31 - 0x7C38 92/17 - 92/24\r
+ _T("9."), _T("氏"), _T("副"), _T("元"), _T("故"), _T("前"), _T("新"), _T("0,"), // 0x7C39 - 0x7C40 92/25 - 92/32\r
+ _T("1,"), _T("2,"), _T("3,"), _T("4,"), _T("5,"), _T("6,"), _T("7,"), _T("8,"), // 0x7C41 - 0x7C48 92/33 - 92/40\r
+ _T("9,"), _T("(社)"), _T("(財)"), _T("(有)"), _T("(株)"), _T("(代)"), _T("(問)"), _T(">"), // 0x7C49 - 0x7C50 92/41 - 92/48\r
+ _T("<"), _T("【"), _T("】"), _T("◇"), _T("^2"), _T("^3"), _T("(CD)"), _T("(vn)"), // 0x7C51 - 0x7C58 92/49 - 92/56\r
+ _T("(ob)"), _T("(cb)"), _T("(ce"), _T("mb)"), _T("(hp)"), _T("(br)"), _T("(p)"), _T("(s)"), // 0x7C59 - 0x7C60 92/57 - 92/64\r
+ _T("(ms)"), _T("(t)"), _T("(bs)"), _T("(b)"), _T("(tb)"), _T("(tp)"), _T("(ds)"), _T("(ag)"), // 0x7C61 - 0x7C68 92/65 - 92/72\r
+ _T("(eg)"), _T("(vo)"), _T("(fl)"), _T("(ke"), _T("y)"), _T("(sa"), _T("x)"), _T("(sy"), // 0x7C69 - 0x7C70 92/73 - 92/80\r
+ _T("n)"), _T("(or"), _T("g)"), _T("(pe"), _T("r)"), _T("(R)"), _T("(C)"), _T("(箏)"), // 0x7C71 - 0x7C78 92/81 - 92/88\r
+ _T("DJ"), _T("[演]"), _T("Fax") // 0x7C79 - 0x7C7B 92/89 - 92/91\r
+ };\r
+\r
+ static const TCHAR *aszSymbolsTable3[] =\r
+ {\r
+ _T("(月)"), _T("(火)"), _T("(水)"), _T("(木)"), _T("(金)"), _T("(土)"), _T("(日)"), _T("(祝)"), // 0x7D21 - 0x7D28 93/01 - 93/08\r
+ _T("㍾"), _T("㍽"), _T("㍼"), _T("㍻"), _T("№"), _T("℡"), _T("(〒)"), _T("○"), // 0x7D29 - 0x7D30 93/09 - 93/16\r
+ _T("〔本〕"), _T("〔三〕"), _T("〔二〕"), _T("〔安〕"), _T("〔点〕"), _T("〔打〕"), _T("〔盗〕"), _T("〔勝〕"), // 0x7D31 - 0x7D38 93/17 - 93/24\r
+ _T("〔敗〕"), _T("〔S〕"), _T("[投]"), _T("[捕]"), _T("[一]"), _T("[二]"), _T("[三]"), _T("[遊]"), // 0x7D39 - 0x7D40 93/25 - 93/32\r
+ _T("[左]"), _T("[中]"), _T("[右]"), _T("[指]"), _T("[走]"), _T("[打]"), _T("㍑"), _T("㎏"), // 0x7D41 - 0x7D48 93/33 - 93/40\r
+ _T("Hz"), _T("ha"), _T("km"), _T("平方km"), _T("hPa"), _T("・"), _T("・"), _T("1/2"), // 0x7D49 - 0x7D50 93/41 - 93/48\r
+ _T("0/3"), _T("1/3"), _T("2/3"), _T("1/4"), _T("3/4"), _T("1/5"), _T("2/5"), _T("3/5"), // 0x7D51 - 0x7D58 93/49 - 93/56\r
+ _T("4/5"), _T("1/6"), _T("5/6"), _T("1/7"), _T("1/8"), _T("1/9"), _T("1/10"), _T("晴れ"), // 0x7D59 - 0x7D60 93/57 - 93/64\r
+ _T("曇り"), _T("雨"), _T("雪"), _T("△"), _T("▲"), _T("▽"), _T("▼"), _T("◆"), // 0x7D61 - 0x7D68 93/65 - 93/72\r
+ _T("・"), _T("・"), _T("・"), _T("◇"), _T("◎"), _T("!!"), _T("!?"), _T("曇/晴"), // 0x7D69 - 0x7D70 93/73 - 93/80\r
+ _T("雨"), _T("雨"), _T("雪"), _T("大雪"), _T("雷"), _T("雷雨"), _T(" "), _T("・"), // 0x7D71 - 0x7D78 93/81 - 93/88\r
+ _T("・"), _T("♪"), _T("℡") // 0x7D79 - 0x7D7B 93/89 - 93/91\r
+ };\r
+\r
+ static const TCHAR *aszSymbolsTable4[] =\r
+ {\r
+ _T("Ⅰ"), _T("Ⅱ"), _T("Ⅲ"), _T("Ⅳ"), _T("Ⅴ"), _T("Ⅵ"), _T("Ⅶ"), _T("Ⅷ"), // 0x7E21 - 0x7E28 94/01 - 94/08\r
+ _T("Ⅸ"), _T("Ⅹ"), _T("XI"), _T("XⅡ"), _T("⑰"), _T("⑱"), _T("⑲"), _T("⑳"), // 0x7E29 - 0x7E30 94/09 - 94/16\r
+ _T("(1)"), _T("(2)"), _T("(3)"), _T("(4)"), _T("(5)"), _T("(6)"), _T("(7)"), _T("(8)"), // 0x7E31 - 0x7E38 94/17 - 94/24\r
+ _T("(9)"), _T("(10)"), _T("(11)"), _T("(12)"), _T("(21)"), _T("(22)"), _T("(23)"), _T("(24)"), // 0x7E39 - 0x7E40 94/25 - 94/32\r
+ _T("(A)"), _T("(B)"), _T("(C)"), _T("(D)"), _T("(E)"), _T("(F)"), _T("(G)"), _T("(H)"), // 0x7E41 - 0x7E48 94/33 - 94/40\r
+ _T("(I)"), _T("(J)"), _T("(K)"), _T("(L)"), _T("(M)"), _T("(N)"), _T("(O)"), _T("(P)"), // 0x7E49 - 0x7E50 94/41 - 94/48\r
+ _T("(Q)"), _T("(R)"), _T("(S)"), _T("(T)"), _T("(U)"), _T("(V)"), _T("(W)"), _T("(X)"), // 0x7E51 - 0x7E58 94/49 - 94/56\r
+ _T("(Y)"), _T("(Z)"), _T("(25)"), _T("(26)"), _T("(27)"), _T("(28)"), _T("(29)"), _T("(30)"), // 0x7E59 - 0x7E60 94/57 - 94/64\r
+ _T("①"), _T("②"), _T("③"), _T("④"), _T("⑤"), _T("⑥"), _T("⑦"), _T("⑧"), // 0x7E61 - 0x7E68 94/65 - 94/72\r
+ _T("⑨"), _T("⑩"), _T("⑪"), _T("⑫"), _T("⑬"), _T("⑭"), _T("⑮"), _T("⑯"), // 0x7E69 - 0x7E70 94/73 - 94/80\r
+ _T("①"), _T("②"), _T("③"), _T("④"), _T("⑤"), _T("⑥"), _T("⑦"), _T("⑧"), // 0x7E71 - 0x7E78 94/81 - 94/88\r
+ _T("⑨"), _T("⑩"), _T("⑪"), _T("⑫"), _T("(31)") // 0x7E79 - 0x7E7D 94/89 - 94/93\r
+ };\r
+\r
+ // シンボルを変換する\r
+ if((wCode >= 0x7A50U) && (wCode <= 0x7A74U)){\r
+ strcpy(lpszDst, aszSymbolsTable1[wCode - 0x7A50U]);\r
+ }\r
+ else if((wCode >= 0x7C21U) && (wCode <= 0x7C7BU)){\r
+ strcpy(lpszDst, aszSymbolsTable2[wCode - 0x7C21U]);\r
+ }\r
+ else if((wCode >= 0x7D21U) && (wCode <= 0x7D7BU)){\r
+ strcpy(lpszDst, aszSymbolsTable3[wCode - 0x7D21U]);\r
+ }\r
+ else if((wCode >= 0x7E21U) && (wCode <= 0x7E7DU)){\r
+ strcpy(lpszDst, aszSymbolsTable4[wCode - 0x7E21U]);\r
+ }\r
+ else{\r
+ strcpy(lpszDst, TEXT("・"));\r
+ }\r
+\r
+ return strlen(lpszDst);\r
+}\r
+\r
+void ProcessEscapeSeq(const BYTE byCode)\r
+{\r
+ // エスケープシーケンス処理\r
+ switch(m_byEscSeqCount){\r
+ // 1バイト目\r
+ case 1U :\r
+ switch(byCode){\r
+ // Invocation of code elements\r
+ case 0x6EU : LockingShiftGL(2U); m_byEscSeqCount = 0U; return; // LS2\r
+ case 0x6FU : LockingShiftGL(3U); m_byEscSeqCount = 0U; return; // LS3\r
+ case 0x7EU : LockingShiftGR(1U); m_byEscSeqCount = 0U; return; // LS1R\r
+ case 0x7DU : LockingShiftGR(2U); m_byEscSeqCount = 0U; return; // LS2R\r
+ case 0x7CU : LockingShiftGR(3U); m_byEscSeqCount = 0U; return; // LS3R\r
+\r
+ // Designation of graphic sets\r
+ case 0x24U : \r
+ case 0x28U : m_byEscSeqIndex = 0U; break;\r
+ case 0x29U : m_byEscSeqIndex = 1U; break;\r
+ case 0x2AU : m_byEscSeqIndex = 2U; break;\r
+ case 0x2BU : m_byEscSeqIndex = 3U; break;\r
+ default : m_byEscSeqCount = 0U; return; // エラー\r
+ }\r
+ break;\r
+\r
+ // 2バイト目\r
+ case 2U :\r
+ if(DesignationGSET(m_byEscSeqIndex, byCode)){\r
+ m_byEscSeqCount = 0U;\r
+ return;\r
+ }\r
+ \r
+ switch(byCode){\r
+ case 0x20 : m_bIsEscSeqDrcs = true; break;\r
+ case 0x28 : m_bIsEscSeqDrcs = true; m_byEscSeqIndex = 0U; break;\r
+ case 0x29 : m_bIsEscSeqDrcs = false; m_byEscSeqIndex = 1U; break;\r
+ case 0x2A : m_bIsEscSeqDrcs = false; m_byEscSeqIndex = 2U; break;\r
+ case 0x2B : m_bIsEscSeqDrcs = false; m_byEscSeqIndex = 3U; break;\r
+ default : m_byEscSeqCount = 0U; return; // エラー\r
+ }\r
+ break;\r
+\r
+ // 3バイト目\r
+ case 3U :\r
+ if(!m_bIsEscSeqDrcs){\r
+ if(DesignationGSET(m_byEscSeqIndex, byCode)){\r
+ m_byEscSeqCount = 0U;\r
+ return;\r
+ }\r
+ }\r
+ else{\r
+ if(DesignationDRCS(m_byEscSeqIndex, byCode)){\r
+ m_byEscSeqCount = 0U;\r
+ return;\r
+ }\r
+ }\r
+\r
+ if(byCode == 0x20U){\r
+ m_bIsEscSeqDrcs = true;\r
+ }\r
+ else{\r
+ // エラー\r
+ m_byEscSeqCount = 0U;\r
+ return;\r
+ }\r
+ break;\r
+\r
+ // 4バイト目\r
+ case 4U :\r
+ DesignationDRCS(m_byEscSeqIndex, byCode);\r
+ m_byEscSeqCount = 0U;\r
+ return;\r
+ }\r
+\r
+ m_byEscSeqCount++;\r
+}\r
+\r
+void LockingShiftGL(const BYTE byIndexG)\r
+{\r
+ // LSx\r
+ m_pLockingGL = &m_CodeG[byIndexG];\r
+}\r
+\r
+void LockingShiftGR(const BYTE byIndexG)\r
+{\r
+ // LSxR\r
+ m_pLockingGR = &m_CodeG[byIndexG];\r
+}\r
+\r
+void SingleShiftGL(const BYTE byIndexG)\r
+{\r
+ // SSx\r
+ m_pSingleGL = &m_CodeG[byIndexG];\r
+}\r
+\r
+const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)\r
+{\r
+ // Gのグラフィックセットを割り当てる\r
+ switch(byCode){\r
+ case 0x42U : m_CodeG[byIndexG] = CODE_KANJI; return true; // Kanji\r
+ case 0x4AU : m_CodeG[byIndexG] = CODE_ALPHANUMERIC; return true; // Alphanumeric\r
+ case 0x30U : m_CodeG[byIndexG] = CODE_HIRAGANA; return true; // Hiragana\r
+ case 0x31U : m_CodeG[byIndexG] = CODE_KATAKANA; return true; // Katakana\r
+ case 0x32U : m_CodeG[byIndexG] = CODE_MOSAIC_A; return true; // Mosaic A\r
+ case 0x33U : m_CodeG[byIndexG] = CODE_MOSAIC_B; return true; // Mosaic B\r
+ case 0x34U : m_CodeG[byIndexG] = CODE_MOSAIC_C; return true; // Mosaic C\r
+ case 0x35U : m_CodeG[byIndexG] = CODE_MOSAIC_D; return true; // Mosaic D\r
+ case 0x36U : m_CodeG[byIndexG] = CODE_PROP_ALPHANUMERIC; return true; // Proportional Alphanumeric\r
+ case 0x37U : m_CodeG[byIndexG] = CODE_PROP_HIRAGANA; return true; // Proportional Hiragana\r
+ case 0x38U : m_CodeG[byIndexG] = CODE_PROP_KATAKANA; return true; // Proportional Katakana\r
+ case 0x49U : m_CodeG[byIndexG] = CODE_JIS_X0201_KATAKANA; return true; // JIS X 0201 Katakana\r
+ case 0x39U : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_1; return true; // JIS compatible Kanji Plane 1\r
+ case 0x3AU : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_2; return true; // JIS compatible Kanji Plane 2\r
+ case 0x3BU : m_CodeG[byIndexG] = CODE_ADDITIONAL_SYMBOLS; return true; // Additional symbols\r
+ default : return false; // 不明なグラフィックセット\r
+ }\r
+}\r
+\r
+const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)\r
+{\r
+ // DRCSのグラフィックセットを割り当てる\r
+ switch(byCode){\r
+ case 0x40U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-0\r
+ case 0x41U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-1\r
+ case 0x42U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-2\r
+ case 0x43U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-3\r
+ case 0x44U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-4\r
+ case 0x45U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-5\r
+ case 0x46U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-6\r
+ case 0x47U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-7\r
+ case 0x48U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-8\r
+ case 0x49U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-9\r
+ case 0x4AU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-10\r
+ case 0x4BU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-11\r
+ case 0x4CU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-12\r
+ case 0x4DU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-13\r
+ case 0x4EU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-14\r
+ case 0x4FU : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // DRCS-15\r
+ case 0x70U : m_CodeG[byIndexG] = CODE_UNKNOWN; return true; // Macro\r
+ default : return false; // 不明なグラフィックセット\r
+ }\r
+}\r
+\r
+WORD convertjis(DWORD jiscode) {\r
+ // 自前で書き直し\r
+ int hi = (jiscode >> 8) & 0xFF;\r
+ int lo = (jiscode >> 0) & 0xFF;\r
+ hi -= 0x21;\r
+ // 下位バイトの処理\r
+ if ( hi & 1 )\r
+ lo += 0x7E;\r
+ else\r
+ {\r
+ lo += 0x1F;\r
+ if ( 0x7F <= lo && lo <= 0x9D )\r
+ lo++;\r
+ }\r
+ // 上位バイトの処理\r
+ hi >>= 1; // 上位7ビットを取り出す\r
+ if ( hi <= 0x1E )\r
+ hi += 0x81;\r
+ else\r
+ hi += 0xC1;\r
+\r
+ return ((hi&0xFF) << 8) | (lo & 0xFF);\r
+}\r
+\r
+\r
--- /dev/null
+#ifndef ARIBSTR_H
+#define ARIBSTR_H 1
+
+#ifdef __cplusplus
+extern "C"{
+#endif /* __cplusplus */
+
+ int AribToString(char *lpszDst, const char *pSrcData, const int dwSrcLen);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
--- /dev/null
+#ifndef B_CAS_CARD_H
+#define B_CAS_CARD_H
+
+#include "portable.h"
+
+typedef struct {
+ uint8_t system_key[32];
+ uint8_t init_cbc[8];
+ int64_t bcas_card_id;
+ int32_t card_status;
+} B_CAS_INIT_STATUS;
+
+typedef struct {
+ int64_t *data;
+ int32_t count;
+} B_CAS_ID;
+
+typedef struct {
+
+ int32_t s_yy; /* start date : year */
+ int32_t s_mm; /* start date : month */
+ int32_t s_dd; /* start date : day */
+
+ int32_t l_yy; /* limit date : year */
+ int32_t l_mm; /* limit date : month */
+ int32_t l_dd; /* limit date : day */
+
+ int32_t hold_time; /* in hour unit */
+
+ int32_t broadcaster_group_id;
+
+ int32_t network_id;
+ int32_t transport_id;
+
+} B_CAS_PWR_ON_CTRL;
+
+typedef struct {
+ B_CAS_PWR_ON_CTRL *data;
+ int32_t count;
+} B_CAS_PWR_ON_CTRL_INFO;
+
+typedef struct {
+ uint8_t scramble_key[16];
+ uint32_t return_code;
+} B_CAS_ECM_RESULT;
+
+typedef struct {
+
+ void *private_data;
+
+ void (* release)(void *bcas);
+
+ int (* init)(void *bcas);
+
+ int (* get_init_status)(void *bcas, B_CAS_INIT_STATUS *stat);
+ int (* get_id)(void *bcas, B_CAS_ID *dst);
+ int (* get_pwr_on_ctrl)(void *bcas, B_CAS_PWR_ON_CTRL_INFO *dst);
+
+ int (* proc_ecm)(void *bcas, B_CAS_ECM_RESULT *dst, uint8_t *src, int len);
+ int (* proc_emm)(void *bcas, uint8_t *src, int len);
+
+} B_CAS_CARD;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern B_CAS_CARD *create_b_cas_card();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* B_CAS_CARD_H */
--- /dev/null
+#ifndef PORTABLE_H
+#define PORTABLE_H
+
+#if (defined(_WIN32) && MSC_VER < 1300)
+
+typedef unsigned char uint8_t;
+typedef signed char int8_t;
+typedef unsigned short uint16_t;
+typedef signed short int16_t;
+typedef unsigned int uint32_t;
+typedef signed int int32_t;
+typedef unsigned __int64 uint64_t;
+typedef signed __int64 int64_t;
+
+#else
+
+#include <inttypes.h>
+
+#endif
+
+#if !defined(_WIN32)
+ #define _open open
+ #define _close close
+ #define _read read
+ #define _write write
+ #define _lseeki64 lseek
+ #define _telli64(fd) (lseek(fd,0,SEEK_CUR))
+ #define _O_BINARY (0)
+ #define _O_RDONLY (O_RDONLY)
+ #define _O_WRONLY (O_WRONLY)
+ #define _O_SEQUENTIAL (0)
+ #define _O_CREAT (O_CREAT)
+ #define _O_TRUNC (O_TRUNC)
+ #define _S_IREAD (S_IRUSR|S_IRGRP|S_IROTH)
+ #define _S_IWRITE (S_IWUSR|S_IWGRP|S_IWOTH)
+#endif
+
+#endif /* PORTABLE_H */
--- /dev/null
+/**\r
+ * @file keys.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+// general\r
+static const char *KEY_NAME = "Name";\r
+static const char *KEY_CHANNEL = "Channel";\r
+\r
+// system\r
+static const char *KEY_VERSION = "Version";\r
+static const char *KEY_HOSTNAME = "Hostname";\r
+static const char *KEY_HTTP_HOST = "HTTP Host";\r
+static const char *KEY_HTTP_PORT = "HTTP Port";\r
+static const char *KEY_STORE_PATH = "Store Path";\r
+static const char *KEY_FORCED_SHUTDOWN = "Forced Shutdown";\r
+static const char *KEY_DO_NOT_IN_SHUTDOWN = "Do not in shutdown";\r
+static const char *KEY_COLLECT_EPG_TIME = "Time to Collect EPG";\r
+static const char *KEY_BEGIN_UDP_PORT = "Begin of UDP Port";\r
+static const char *KEY_CACHE_PATH = "Cache Path";\r
+static const char *KEY_MAPPING_UDP_TO_TUNER_SERVICE_ID = "Mapping for UDP Port to Tuner and Service ID";\r
+static const char *KEY_MAPPING_TUNER_SERVICE_ID_TO_UDP = "Mapping for Tuner and Service ID to UDP Port";\r
+static const char *KEY_MAPPING_TUNER_SERVICE_ID_TO_CHANNEL = "Mapping for Tuner and Service ID to Channel";\r
+static const char *KEY_UDP_IN_USE = "UDP in use";\r
+static const char *KEY_HLS_INFO = "HLS Information";\r
+static const char *KEY_HLS_INSTANCE = "HLS Instance";\r
+static const char *KEY_PRESETS = "Presets";\r
+static const char *KEY_PRESET = "Preset";\r
+static const char *KEY_POWER_MANAGER = "Power Manager";\r
+static const char *KEY_DEFAULT = "default";\r
+\r
+static const char *KEY_TUNERS = "Tuners";\r
+static const char *KEY_INITIALIZED = "Initialized";\r
+static const char *KEY_ENABLED = "Enabled";\r
+static const char *KEY_TYPE = "Type";\r
+static const char *KEY_CHANNELS = "Channels";\r
+static const char *KEY_CHANNEL_ID = "Channel ID";\r
+static const char *KEY_SERVICES = "Services";\r
+static const char *KEY_SERVICE_ID = "Service ID";\r
+static const char *KEY_SERVICE_TYPE = "Service Type";\r
+static const char *KEY_LNB_POWER = "LNB Power";\r
+static const char *KEY_CN = "C_N";\r
+static const char *KEY_AGC = "AGC";\r
+static const char *KEY_MAX_AGC = "Max AGC";\r
+static const char *KEY_TEMP_DATA = "Temp Data";\r
+static const char *KEY_IPTV_ENABLED = "IPTV Enabled";\r
+static const char *KEY_PROGRAMS = "Programs";\r
+\r
+static const char *KEY_RESULT = "Result";\r
+\r
+// EPG\r
+#define KEY_EPG_EVENT_ID "Event ID"\r
+#define KEY_EPG_DATE "Date"\r
+#define KEY_EPG_START "Start"\r
+#define KEY_EPG_END "End"\r
+#define KEY_EPG_DURATION "Duration"\r
+#define KEY_EPG_TITLE "Title"\r
+#define KEY_EPG_DESCRIPTION "Description"\r
+#define KEY_EPG_CHANNEL "Channel"\r
+#define KEY_EPG_STATUS "Status"\r
+#define KEY_EPG_SERVICE_ID "Service ID"\r
+#define KEY_EPG_RESV_ID "Reservation ID"\r
+#define KEY_EPG_LAST_RESV_ID "Last Reservation ID"\r
+#define KEY_EPG_REPEAT "Repeat"\r
+#define KEY_EPG_KEYWORDS "Keywords"\r
+#define KEY_EPG_RESERVED_BY_KEYWORDS "Reserved by keywords"\r
+#define KEY_EPG_EXT_ITEM_DESCRIPTION "Extended Item Description"\r
+#define KEY_EPG_EXT_ITEM "Extended Item"\r
+#define KEY_EPG_EXT_ITEMS "Extended Items"\r
+\r
+// ローカライズ用キー\r
+#define KEY_I18N_Main_Menu "Main Menu"\r
+#define KEY_I18N_Reservation "Reservation"\r
+#define KEY_I18N_New_Reservation "New Reservation"\r
+#define KEY_I18N_Registration "Registration"\r
+#define KEY_I18N_Keywords "Keywords"\r
+#define KEY_I18N_Add "Add"\r
+#define KEY_I18N_Tuner_Status "Tuner Status"\r
+#define KEY_I18N_Tuner "Tuner"\r
+#define KEY_I18N_Station_Name "Station Name"\r
+#define KEY_I18N_Date "Date"\r
+#define KEY_I18N_Start_Time "Start Time"\r
+#define KEY_I18N_End_Time "End Time"\r
+#define KEY_I18N_Time "Time"\r
+#define KEY_I18N_Stop "Stop"\r
+#define KEY_I18N_Cancel "Cancel"\r
+#define KEY_I18N_Delete "Delete"\r
+#define KEY_I18N_Programs "Programs"\r
+#define KEY_I18N_TV "TV"\r
+#define KEY_I18N_Video "Video"\r
+#define KEY_I18N_Repeat "Repeat"\r
+#define KEY_I18N_Repeat_off "Repeat_off"\r
+#define KEY_I18N_Repeat_everyday "Repeat_everyday"\r
+#define KEY_I18N_Repeat_weekly "Repeat_weekly"\r
+#define KEY_I18N_Repeat_weekday "Repeat_weekday"\r
+#define KEY_I18N_Digital_Terrestrial_Television_Broadcasting "Digital Terrestrial Television Broadcasting"\r
+#define KEY_I18N_Broadcasting_Time "Broadcasting Time"\r
+#define KEY_I18N_Program_Title "Program Title"\r
+#define KEY_I18N_Description "Description"\r
+\r
+// other\r
+static const char * KEY_COUNTER = "Counter";\r
--- /dev/null
+/**
+ * @file Analyzer.cpp
+ *
+ */
+
+#include "mpeg2/ts/Analyzer.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+Analyzer::Analyzer()
+{
+ MPEG2_MUTEX_INIT;
+
+ _flag = 0;
+
+ _continuity_counter_pat = 0xFF;
+ _continuity_counter_sdt = 0xFF;
+ _continuity_counter_0012 = 0xFF;
+ _continuity_counter_0026 = 0xFF;
+ _continuity_counter_0027 = 0xFF;
+}
+
+Analyzer::~Analyzer()
+{
+ MPEG2_MUTEX_DESTROY;
+}
+
+void Analyzer::setListener(Listener *listener)
+{
+ MPEG2_LOCK;
+ _listener = listener;
+ MPEG2_UNLOCK;
+}
+
+void Analyzer::setFlag(uint32_t flag, bool onoff)
+{
+ MPEG2_LOCK;
+ if (onoff)
+ {
+ _flag |= flag;
+ }
+ else
+ {
+ _flag &= ~flag;
+ }
+ MPEG2_UNLOCK;
+}
+
+void Analyzer::putPAT(Header *header, uint8_t *packet)
+{
+ if (_continuity_counter_pat != 0xFF)
+ {
+ if (((_continuity_counter_pat + 1) & 0x0F) != header->_continuity_counter)
+ {
+ printf("packet loss\n");
+ _pat.reset();
+ ((Table *)&_pat)->reset();
+ }
+ _continuity_counter_pat = header->_continuity_counter;
+ }
+ if (_pat.decode(header, packet))
+ {
+ if ((_listener) && ((_flag & FLG_PAT) == FLG_PAT))
+ {
+ _listener->detect(&_pat);
+ }
+ _pat.reset();
+ }
+}
+
+void Analyzer::putSDT(Header *header, uint8_t *packet)
+{
+ if (_continuity_counter_sdt != 0xFF)
+ {
+ if (((_continuity_counter_sdt + 1) & 0x0F) != header->_continuity_counter)
+ {
+ printf("packet loss\n");
+ _sdt.reset();
+ ((Table *)&_sdt)->reset();
+ }
+ _continuity_counter_sdt = header->_continuity_counter;
+ }
+ if (_sdt.decode(header, packet))
+ {
+ if ((_listener) && ((_flag & FLG_SDT) == FLG_SDT))
+ {
+ _listener->detect(&_sdt);
+ }
+ _sdt.reset();
+ }
+}
+
+void Analyzer::putEIT(Header *header, uint8_t *packet)
+{
+ switch (header->_pid)
+ {
+ case PID_EIT_0012:
+ if (_continuity_counter_0012 != 0xFF)
+ {
+ if (((_continuity_counter_0012 + 1) & 0x0F) != header->_continuity_counter)
+ {
+ printf("packet loss\n");
+ _eit_0012.reset();
+ ((Table *)&_eit_0012)->reset();
+ }
+ }
+ _continuity_counter_0012 = header->_continuity_counter;
+ break;
+
+ case PID_EIT_0026:
+ if (_continuity_counter_0026 != 0xFF)
+ {
+ if (((_continuity_counter_0026 + 1) & 0x0F) != header->_continuity_counter)
+ {
+ printf("packet loss\n");
+ _eit_0026.reset();
+ ((Table *)&_eit_0026)->reset();
+ }
+ }
+ _continuity_counter_0026 = header->_continuity_counter;
+ break;
+
+ case PID_EIT_0027:
+ if (_continuity_counter_0027 != 0xFF)
+ {
+ if (((_continuity_counter_0027 + 1) & 0x0F) != header->_continuity_counter)
+ {
+ printf("packet loss\n");
+ _eit_0027.reset();
+ ((Table *)&_eit_0027)->reset();
+ }
+ }
+ _continuity_counter_0027 = header->_continuity_counter;
+ break;
+ }
+
+ switch (header->_pid)
+ {
+ case PID_EIT_0012:
+ if (_eit_0012.decode(header, packet))
+ {
+ if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
+ {
+ _listener->detect(&_eit_0012);
+ }
+ _eit_0012.reset();
+ }
+ break;
+ case PID_EIT_0026:
+ if (_eit_0026.decode(header, packet))
+ {
+ if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
+ {
+ _listener->detect(&_eit_0026);
+ }
+ _eit_0026.reset();
+ }
+ break;
+ case PID_EIT_0027:
+ if (_eit_0027.decode(header, packet))
+ {
+ if ((_listener) && ((_flag & FLG_EIT) == FLG_EIT))
+ {
+ _listener->detect(&_eit_0027);
+ }
+ _eit_0027.reset();
+ }
+ break;
+ }
+}
+
+void Analyzer::put(uint8_t *buffer, uint32_t size)
+{
+ uint32_t offset = 0;
+ while (offset < size)
+ {
+ if (buffer[offset] != SYNC_BYTE)
+ {
+ break;
+ }
+
+ MPEG2_LOCK;
+
+ Header header(&buffer[offset]);
+ if (!header._transport_error)
+ {
+ switch (header._pid)
+ {
+ case PID_PAT:
+ putPAT(&header, &buffer[offset]);
+ break;
+
+ case PID_CAT:
+ break;
+
+ case PID_NIT:
+ break;
+
+ case PID_SDT_BAT:
+ putSDT(&header, &buffer[offset]);
+ break;
+
+ case PID_EIT_0012:
+ case PID_EIT_0026:
+ case PID_EIT_0027:
+ putEIT(&header, &buffer[offset]);
+ break;
+
+ case PID_RST:
+ break;
+
+ case PID_TDT:
+ break;
+ }
+ }
+
+ MPEG2_UNLOCK;
+
+ offset += PACKET_SIZE;
+ }
+}
+
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file Analyzer.h
+ *
+ */
+
+#pragma once
+
+#include "mpeg2/ts/Header.h"
+#include "mpeg2/ts/PAT.h"
+#include "mpeg2/ts/PMT.h"
+#include "mpeg2/ts/SDT.h"
+#include "mpeg2/ts/EIT.h"
+
+#ifdef _WIN32
+#include <windows.h>
+#define MPEG2_MUTEX CRITICAL_SECTION
+#define MPEG2_MUTEX_INIT InitializeCriticalSection(&_lock)
+#define MPEG2_MUTEX_DESTROY DeleteCriticalSection(&_lock)
+#define MPEG2_LOCK DeleteCriticalSection(&_lock)
+#define MPEG2_UNLOCK LeaveCriticalSection(&_lock)
+#else
+#include <pthread.h>
+#define MPEG2_MUTEX pthread_mutex_t
+#define MPEG2_MUTEX_INIT pthread_mutex_init(&_lock, NULL)
+#define MPEG2_MUTEX_DESTROY pthread_mutex_destroy(&_lock)
+#define MPEG2_LOCK pthread_mutex_lock(&_lock)
+#define MPEG2_UNLOCK pthread_mutex_unlock(&_lock)
+#endif
+
+namespace MPEG2
+{
+namespace TS
+{
+
+class Analyzer
+{
+public:
+ enum
+ {
+ FLG_PAT = 0x00000001,
+ FLG_SDT = 0x00000002,
+ FLG_EIT = 0x00000004,
+ };
+ class Listener
+ {
+ public:
+ virtual void detect(PAT *pat) = 0;
+ virtual void detect(SDT *sdt) = 0;
+ virtual void detect(EIT *eit) = 0;
+ };
+
+private:
+ MPEG2_MUTEX _lock;
+ uint32_t _flag;
+ Listener * _listener;
+
+ uint8_t _continuity_counter_pat;
+ PAT _pat;
+
+ uint8_t _continuity_counter_sdt;
+ SDT _sdt;
+
+ uint8_t _continuity_counter_0012;
+ EIT _eit_0012;
+
+ uint8_t _continuity_counter_0026;
+ EIT _eit_0026;
+
+ uint8_t _continuity_counter_0027;
+ EIT _eit_0027;
+
+ void putPAT(Header *header, uint8_t *packet);
+ void putSDT(Header *header, uint8_t *packet);
+ void putEIT(Header *header, uint8_t *packet);
+
+
+public:
+ Analyzer();
+ ~Analyzer();
+
+ void setListener(Listener *listener);
+ void setFlag(uint32_t flag, bool onoff);
+
+ void put(uint8_t *buffer, uint32_t size);
+};
+
+} // TS
+} // MPEG2
--- /dev/null
+/**\r
+ * @file EIT.cpp\r
+ *\r
+ */\r
+\r
+#include "b25/aribstr.h"\r
+#include "mpeg2/ts/EIT.h"\r
+\r
+namespace MPEG2\r
+{\r
+namespace TS\r
+{\r
+\r
+EIT::EIT()\r
+{\r
+ reset();\r
+}\r
+\r
+EIT::EIT(EIT &eit)\r
+{\r
+ _table_id = eit._table_id;\r
+ _section_syntax_indicator = eit._section_syntax_indicator;\r
+ _section_length = eit._section_length;\r
+ _service_id = eit._service_id;\r
+ _version_number = eit._version_number;\r
+ _current_next_indicator = eit._current_next_indicator;\r
+ _section_number = eit._section_number;\r
+ _last_section_number = eit._last_section_number;\r
+ _transport_stream_id = eit._transport_stream_id;\r
+ _original_network_id = eit._original_network_id;\r
+ _segment_last_section_number = eit._segment_last_section_number;\r
+ _last_table_id = eit._last_table_id;\r
+ _event_offset = eit._event_offset;\r
+ _length = eit._length;\r
+ memcpy(_event_data, eit._event_data, sizeof(_event_data));\r
+}\r
+\r
+EIT::~EIT()\r
+{\r
+ reset();\r
+}\r
+\r
+bool EIT::decode_section()\r
+{\r
+ bool result = false;\r
+\r
+ _table_id = _section[0x00];\r
+ if ((TABLE_ID_SELF <= _table_id) && (_table_id <= TABLE_ID_OTHER_SCHEDULE_END))\r
+ {\r
+ _section_syntax_indicator = (_section[0x01] & 0x80) >> 7;\r
+ _section_length = ((_section[0x01] << 8) + _section[0x02]) & 0x0FFF;\r
+ _service_id = (_section[0x03] << 8) + _section[0x04];\r
+ _version_number = (_section[0x05] & 0x3E) >> 1;\r
+ _current_next_indicator = _section[0x05] & 0x01;\r
+ _section_number = _section[0x06];\r
+ _last_section_number = _section[0x07];\r
+ _transport_stream_id = (_section[0x08] << 8) + _section[0x09];\r
+ _original_network_id = (_section[0x0a] << 8) + _section[0x0b];\r
+ _segment_last_section_number = _section[0x0c];\r
+ _last_table_id = _section[0x0d];\r
+\r
+ if (GetCrc32(_section, _section_length + 3) == 0)\r
+ {\r
+ memcpy(_event_data, &_section[0x0e], _section_length - 3 - 11);\r
+ _event_offset = 0;\r
+ result = true;\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+void EIT::reset()\r
+{\r
+ _table_id = 0;\r
+ _section_length = 0;\r
+ _event_offset = 0xFFFF;\r
+}\r
+\r
+EIT::Event *EIT::nextEvent()\r
+{\r
+ if ((_event_offset >= 0x00) && (_event_offset + 0x0c < _section_length - 0x0e))\r
+ {\r
+ _event._event_id = (_event_data[_event_offset] << 8) + _event_data[_event_offset + 0x01];\r
+\r
+ // start_time\r
+ uint16_t mjd = (_event_data[_event_offset + 0x02] << 8) + _event_data[_event_offset + 0x03];\r
+ _event._st_year = (uint16_t)((mjd - 15078.2) / 365.25);\r
+ _event._st_month = (uint8_t)((mjd - 14956.1 - (uint16_t)(_event._st_year * 365.25)) / 30.6001);\r
+ _event._st_day = mjd - 14956 - (uint16_t)(_event._st_year * 365.25) - (uint8_t)(_event._st_month * 30.6001);\r
+ if ((_event._st_month == 14) || (_event._st_month == 15))\r
+ {\r
+ _event._st_year += 1901;\r
+ _event._st_month -= 13;\r
+ }\r
+ else\r
+ {\r
+ _event._st_year += 1900;\r
+ _event._st_month -= 1;\r
+ }\r
+ _event._st_hour = ((_event_data[_event_offset + 0x04] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x04] & 0x0F);\r
+ _event._st_min = ((_event_data[_event_offset + 0x05] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x05] & 0x0F);\r
+ _event._st_sec = ((_event_data[_event_offset + 0x06] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x06] & 0x0F);\r
+\r
+ // duration\r
+ _event._dur_hour = ((_event_data[_event_offset + 0x07] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x07] & 0x0F);\r
+ _event._dur_min = ((_event_data[_event_offset + 0x08] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x08] & 0x0F);\r
+ _event._dur_sec = ((_event_data[_event_offset + 0x09] & 0xF0) >> 4) * 10 + (_event_data[_event_offset + 0x09] & 0x0F);\r
+\r
+ _event._running_status = (_event_data[_event_offset + 0x0a] & 0xE0) >> 5;\r
+ _event._free_CA_mode = (_event_data[_event_offset + 0x0a] & 0x10) >> 4;\r
+ _event._descriptors_loop_length = ((_event_data[_event_offset + 0x0a] & 0x0F) << 8) + _event_data[_event_offset + 0x0b];\r
+\r
+ if (_event_offset + 0x0c + _event._descriptors_loop_length <= _section_length)\r
+ {\r
+ _event._descriptor_ptr = &_event_data[_event_offset + 0x0c];\r
+ _event._descriptor_offset = 0;\r
+ _event_offset += (0x0c + _event._descriptors_loop_length);\r
+\r
+ return &_event;\r
+ }\r
+ }\r
+\r
+ _event._event_id = 0;\r
+ _event._descriptors_loop_length = 0;\r
+ return NULL;\r
+}\r
+\r
+Descriptor *EIT::Event::nextDescriptor()\r
+{\r
+ if (_descriptors_loop_length >= 2)\r
+ {\r
+ uint16_t len = Table::parseDescriptor(&_descriptor_ptr[_descriptor_offset], _descriptors_loop_length, &_descriptor);\r
+ if (len != 0)\r
+ {\r
+ _descriptor_offset += len;\r
+ _descriptors_loop_length -= len;\r
+ return &_descriptor;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+} // TS\r
+} // MPEG2\r
--- /dev/null
+/**\r
+ * @file EIT.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "mpeg2/ts/Table.h"\r
+\r
+namespace MPEG2\r
+{\r
+\r
+namespace TS\r
+{\r
+\r
+class EIT : public Table\r
+{\r
+protected:\r
+ bool decode_section();\r
+\r
+public:\r
+ /*\r
+ * 0x4E : EIT(自ストリームの現在と次の番組)\r
+ * 0x4F : EIT(他ストリームの現在と次の番組)\r
+ * 0x50 - 0x5F : EIT(自ストリーム、スケジュール)\r
+ * 0x60 - 0x6F : EIT(他ストリーム、スケジュール)\r
+ */\r
+ enum\r
+ {\r
+ TABLE_ID_SELF = 0x4E,\r
+ TABLE_ID_OTHER = 0x4F,\r
+ TABLE_ID_SELF_SCHEDULE_BEGIN = 0x50,\r
+ TABLE_ID_SELF_SCHEDULE_END = 0x5F,\r
+ TABLE_ID_OTHER_SCHEDULE_BEGIN = 0x60,\r
+ TABLE_ID_OTHER_SCHEDULE_END = 0x6F\r
+ };\r
+\r
+ uint8_t _table_id; // 8\r
+ uint8_t _section_syntax_indicator; // 1\r
+ // 1 '1'\r
+ // 2 '11'\r
+ uint16_t _section_length; // 12\r
+ uint16_t _service_id; // 16\r
+ // 2 '11'\r
+ uint8_t _version_number; // 5\r
+ uint8_t _current_next_indicator; // 1\r
+ uint8_t _section_number; // 8\r
+ uint8_t _last_section_number; // 8\r
+ uint16_t _transport_stream_id; // 16\r
+ uint16_t _original_network_id; // 16\r
+ uint8_t _segment_last_section_number; // 8\r
+ uint8_t _last_table_id; // 8\r
+\r
+ class Event\r
+ {\r
+\r
+ public:\r
+ uint16_t _event_id; // 16\r
+ // start_time 40\r
+ uint16_t _st_year;\r
+ uint8_t _st_month;\r
+ uint8_t _st_day;\r
+ uint8_t _st_hour;\r
+ uint8_t _st_min;\r
+ uint8_t _st_sec;\r
+ // duration 24\r
+ uint8_t _dur_hour;\r
+ uint8_t _dur_min;\r
+ uint8_t _dur_sec;\r
+ uint8_t _running_status; // 3\r
+ uint8_t _free_CA_mode; // 1\r
+ uint16_t _descriptors_loop_length; // 12\r
+\r
+ uint8_t * _descriptor_ptr;\r
+ uint16_t _descriptor_offset;\r
+ Descriptor _descriptor;\r
+ Descriptor *nextDescriptor();\r
+ };\r
+\r
+ uint8_t _event_data[MAX_SECT_LEN];\r
+ uint16_t _event_offset;\r
+ Event _event;\r
+\r
+public:\r
+ EIT();\r
+ EIT(EIT &eit);\r
+ ~EIT();\r
+ void reset();\r
+\r
+ Event *nextEvent();\r
+};\r
+\r
+} // TS\r
+} // MPEG2\r
--- /dev/null
+/**
+ * @file Header.cpp
+ *
+ */
+
+#include "mpeg2/ts/Header.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+Header::Header(uint8_t *packet)
+{
+ _sync_byte = packet[0x00];
+ _transport_error = (packet[0x01] & 0x80) >> 7;
+ _payload_unit_start = (packet[0x01] & 0x40) >> 6;
+ _transport_priority = (packet[0x01] & 0x20) >> 5;
+ _pid = ((packet[0x01] << 8) + packet[0x02]) & 0x1FFF;
+ _transport_scramble_control = (packet[0x03] & 0xc0) >> 6;
+ _adaptation_field_control = (packet[0x03] & 0x30) >> 4;
+ _continuity_counter = packet[0x03] & 0x0F;
+}
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file Header.h
+ *
+ */
+#pragma once
+
+#include <stdint.h>
+
+namespace MPEG2
+{
+namespace TS
+{
+
+enum
+{
+ SYNC_BYTE = 0x47,
+ PACKET_SIZE = 188,
+};
+
+enum
+{
+ PID_PAT = 0x0000,
+ PID_CAT = 0x0001,
+ PID_NIT = 0x0010,
+ PID_SDT_BAT = 0x0011,
+ PID_EIT_0012 = 0x0012,
+ PID_EIT_0026 = 0x0026,
+ PID_EIT_0027 = 0x0027,
+ PID_RST = 0x0013,
+ PID_TDT = 0x0014,
+};
+
+class Header
+{
+public:
+ uint8_t _sync_byte; // 8
+ uint8_t _transport_error; // 1
+ uint8_t _payload_unit_start; // 1
+ uint8_t _transport_priority; // 1
+ uint16_t _pid; // 13
+ uint8_t _transport_scramble_control; // 2
+ uint8_t _adaptation_field_control; // 2
+ uint8_t _continuity_counter; // 4
+
+ Header(uint8_t *packet);
+};
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file PAT.cpp
+ *
+ */
+
+#include "mpeg2/ts/PAT.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+PAT::PAT()
+{
+ _programs = NULL;
+ reset();
+}
+
+PAT::PAT(const PAT &pat)
+{
+ _table_id = pat._table_id;
+ _section_syntax_indicator = pat._section_syntax_indicator;
+ _section_length = pat._section_length;
+ _transport_stream_id = pat._transport_stream_id;
+ _version_number = pat._version_number;
+ _current_next_indicator = pat._current_next_indicator;
+ _section_number = pat._section_number;
+ _last_section_number = pat._last_section_number;
+ _program_count = pat._program_count;
+ _programs = (struct _program *)malloc(sizeof(uint16_t) * 2 * _program_count);
+ for (int i = 0; i < _program_count; ++i)
+ {
+ _programs[i]._program_number = pat._programs[i]._program_number;
+ _programs[i]._pid = pat._programs[i]._pid;
+ }
+}
+
+PAT::~PAT()
+{
+ reset();
+}
+
+bool PAT::decode_section()
+{
+ bool result = true;
+ _table_id = _section[0x00];
+ if (_table_id == TABLE_ID_PAT)
+ {
+ _section_syntax_indicator = (_section[0x01] & 0x80) >> 7;
+ _section_length = ((_section[0x01] << 8) + _section[0x02]) & 0x0FFF;
+ _transport_stream_id = (_section[0x03] << 8) + _section[0x04];
+ _version_number = (_section[0x05] & 0x3E) >> 1;
+ _current_next_indicator = _section[0x05] & 0x01;
+ _section_number = _section[0x06];
+ _last_section_number = _section[0x07];
+ _program_count = (_section_length - 9) / 4;
+ if (_programs != NULL)
+ {
+ free(_programs);
+ }
+ _programs = (struct _program *)malloc(sizeof(uint16_t) * 2 * _program_count);
+ for (int i = 0; i < _program_count; ++i)
+ {
+ _programs[i]._program_number = (_section[0x08 + i * 4] << 8) + _section[0x09 + i * 4];
+ _programs[i]._pid = ((_section[0x0A + i * 4] << 8) + _section[0x0B + i * 4]) & 0x1FFF;
+ }
+ }
+ else
+ {
+ reset();
+ result = false;
+ }
+ return result;
+}
+
+void PAT::reset()
+{
+ _table_id = 0;
+ _section_syntax_indicator = 0;
+ _section_length = 0;
+ _transport_stream_id = 0;
+ _version_number = 0;
+ _current_next_indicator = 0;
+ _section_number = 0;
+ _last_section_number = 0;
+ _program_count = 0;
+ if (_programs != NULL)
+ {
+ free(_programs);
+ _programs = NULL;
+ }
+}
+
+bool PAT::isEqual(PAT *pat)
+{
+ bool result = false;
+ if (pat != NULL)
+ {
+ if (_program_count == pat->_program_count)
+ {
+ if ((_programs != NULL) && (pat->_programs != NULL))
+ {
+ result = (memcmp(_programs, pat->_programs, sizeof(uint16_t) * 2 * _program_count) == 0);
+ }
+ }
+ }
+ return result;
+}
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file PAT.h
+ *
+ */
+
+#pragma once
+
+#include "mpeg2/ts/Table.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+class PAT : public Table
+{
+public:
+ uint8_t _table_id; // 8
+ uint8_t _section_syntax_indicator; // 1
+ // 1 '0'
+ // 2 reserved
+ uint16_t _section_length; // 12
+ uint16_t _transport_stream_id; // 16
+ // 2 reserved
+ uint8_t _version_number; // 5
+ uint8_t _current_next_indicator; // 1
+ uint8_t _section_number; // 8
+ uint8_t _last_section_number; // 8
+ uint16_t _program_count;
+ struct _program
+ {
+ uint16_t _program_number; // 16
+ // 3 reserved
+ uint16_t _pid; // 13
+ } * _programs;
+ // 32 CRC
+
+protected:
+ bool decode_section();
+
+public:
+ PAT();
+ PAT(const PAT &pat);
+ ~PAT();
+ void reset();
+ bool isEqual(PAT *pat);
+};
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file PMT.cpp
+ *
+ */
+
+#include "mpeg2/ts/PMT.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+PMT::PMT()
+{
+ _descriptor = NULL;
+ _element_count = 0;
+ _elements = NULL;
+}
+
+PMT::~PMT()
+{
+ if (_descriptor != NULL)
+ {
+ free(_descriptor);
+ }
+ if (_elements != NULL)
+ {
+ for (int i = 0; i < _element_count; ++i)
+ {
+ if (_elements[i]._descriptor != NULL)
+ {
+ free(_elements[i]._descriptor);
+ }
+ }
+ free(_elements);
+ }
+}
+
+bool PMT::decode_section()
+{
+ bool result = true;
+ _table_id = _section[0x00];
+ if (_table_id == TABLE_ID_PMT)
+ {
+ _section_syntax_indicator = (_section[0x01] & 0x80) >> 7;
+ _section_length = ((_section[0x01] << 8) + _section[0x02]) & 0x0FFF;
+ _program_number = (_section[0x03] << 8) + _section[0x04];
+ _version_number = (_section[0x05] & 0x3E) >> 1;
+ _current_next_indicator = _section[0x05] & 0x01;
+ _section_number = _section[0x06];
+ _last_section_number = _section[0x07];
+ _PCR_PID = ((_section[0x08] << 8) + _section[0x09]) & 0x1FFF;
+ _program_info_length = ((_section[0x0a] << 8) + _section[0x0b]) & 0x0FFF;
+ if (_descriptor != NULL)
+ {
+ free(_descriptor);
+ }
+ _descriptor = (uint8_t *)malloc(_program_info_length);
+ memcpy(_descriptor, &_section[0x0c], _program_info_length);
+
+ if (_elements != NULL)
+ {
+ for (int i = 0; i < _element_count; ++i)
+ {
+ if (_elements[i]._descriptor != NULL)
+ {
+ free(_elements[i]._descriptor);
+ }
+ }
+ free(_elements);
+ _elements = NULL;
+ }
+
+ uint16_t offset = 0x0c + _program_info_length;
+
+ _element_count = 0;
+ while (offset < (_length - 4))
+ {
+ if (_elements == NULL)
+ {
+ _elements = (struct _element *)malloc(sizeof(struct _element));
+ }
+ else
+ {
+ _elements = (struct _element *)realloc(_elements, sizeof(struct _element) * (_element_count + 1));
+ }
+ _elements[_element_count]._stream_type = _section[offset];
+ _elements[_element_count]._elementary_PID = ((_section[offset + 1] << 8) + _section[offset + 2]) & 0x1FFF;
+ _elements[_element_count]._ES_info_length = ((_section[offset + 3] << 8) + _section[offset + 4]) & 0x0FFF;
+ _elements[_element_count]._descriptor = (uint8_t *)malloc(_elements[_element_count]._ES_info_length);
+ memcpy(_elements[_element_count]._descriptor, &_section[offset + 5], _elements[_element_count]._ES_info_length);
+ offset += (5 + _elements[_element_count]._ES_info_length);
+ _element_count++;
+ }
+ }
+ else
+ {
+ reset();
+ result = false;
+ }
+
+ return result;
+}
+
+void PMT::reset()
+{
+ _table_id = 0;
+ _section_syntax_indicator = 0;
+ _section_length = 0;
+ _program_number = 0;
+ _version_number = 0;
+ _current_next_indicator = 0;
+ _section_number = 0;
+ _last_section_number = 0;
+ _PCR_PID = 0;
+ _program_info_length = 0;
+ if (_descriptor != NULL)
+ {
+ free(_descriptor);
+ _descriptor = NULL;
+ }
+ if (_elements != NULL)
+ {
+ for (int i = 0; i < _element_count; ++i)
+ {
+ if (_elements[i]._descriptor != NULL)
+ {
+ free(_elements[i]._descriptor);
+ }
+ }
+ free(_elements);
+ _elements = NULL;
+ _element_count = 0;
+ }
+}
+
+} // TS
+} // MPEG2
--- /dev/null
+/**
+ * @file PMT.h
+ *
+ */
+
+#pragma once
+
+#include "mpeg2/ts/Table.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+class PMT : public Table
+{
+public:
+ uint8_t _table_id; // 8
+ uint8_t _section_syntax_indicator; // 1
+ // 1 '0'
+ // 2 reserved
+ uint16_t _section_length; // 12
+ uint16_t _program_number; // 16
+ // 2 reserved
+ uint8_t _version_number; // 5
+ uint8_t _current_next_indicator; // 1
+ uint8_t _section_number; // 8
+ uint8_t _last_section_number; // 8
+ // 3 reserved
+ uint16_t _PCR_PID; // 13
+ // 4 reserved
+ uint16_t _program_info_length; // 12
+ uint8_t * _descriptor; // N
+ uint16_t _element_count;
+ struct _element
+ {
+ uint8_t _stream_type; // 8
+ // 3 reserved
+ uint16_t _elementary_PID; // 13
+ // 4 reserved
+ uint16_t _ES_info_length; // 12
+ uint8_t * _descriptor; // N
+ } * _elements;
+ // 32 CRC
+
+protected:
+ bool decode_section();
+
+public:
+ PMT();
+ ~PMT();
+ void reset();
+};
+
+} // TS
+} // MPEG2
--- /dev/null
+/**\r
+ * @file SDT.cpp\r
+ *\r
+ */\r
+\r
+#include "b25/aribstr.h"\r
+#include "mpeg2/ts/SDT.h"\r
+\r
+namespace MPEG2\r
+{\r
+namespace TS\r
+{\r
+\r
+static int getBit(unsigned char *byte, int *pbit, int gbit)\r
+{\r
+ int pbyte = *pbit / 8;\r
+ unsigned char *fbyte = byte + pbyte;\r
+\r
+ int cutbit = *pbit - (pbyte * 8);\r
+ int lcutbit = 32 - (cutbit + gbit);\r
+\r
+ unsigned char tbuf[4]; //\r
+ unsigned int tnum;\r
+\r
+ memcpy(tbuf, fbyte, sizeof(unsigned char) * 4);\r
+\r
+ //\r
+ tbuf[0] = tbuf[0] << cutbit;\r
+ tbuf[0] = tbuf[0] >> cutbit;\r
+\r
+ //\r
+ tnum = tbuf[0] << 24 | tbuf[1] << 16 | tbuf[2] << 8 | tbuf[3];\r
+\r
+ //\r
+ tnum = tnum >> lcutbit;\r
+\r
+ *pbit += gbit;\r
+\r
+ return tnum;\r
+ \r
+}\r
+\r
+static int parseSDThead(unsigned char *data, SDThead *h)\r
+{\r
+ int boff = 0;\r
+\r
+ memset(h, 0, sizeof(SDThead));\r
+\r
+ boff = 0;\r
+ h->table_id = getBit(data, &boff, 8);\r
+ h->section_syntax_indicator = getBit(data, &boff, 1);\r
+ h->reserved_future_use1 = getBit(data, &boff, 1);\r
+ h->reserved1 = getBit(data, &boff, 2);\r
+ h->section_length = getBit(data, &boff, 12);\r
+ h->transport_stream_id = getBit(data, &boff, 16);\r
+ h->reserved2 = getBit(data, &boff, 2);\r
+ h->version_number = getBit(data, &boff, 5);\r
+ h->current_next_indicator = getBit(data, &boff, 1);\r
+ h->section_number = getBit(data, &boff, 8);\r
+ h->last_section_number = getBit(data, &boff, 8);\r
+ h->original_network_id = getBit(data, &boff, 16);\r
+ h->reserved_future_use2 = getBit(data, &boff, 8);\r
+\r
+ return 11;\r
+}\r
+\r
+static int parseSDTbody(unsigned char *data, SDTbody *b)\r
+{\r
+ int boff = 0;\r
+\r
+ memset(b, 0, sizeof(SDTbody));\r
+\r
+ b->service_id = getBit(data, &boff, 16);\r
+ b->reserved_future_use1 = getBit(data, &boff, 3);\r
+ b->EIT_user_defined_flags = getBit(data, &boff, 3);\r
+ b->EIT_schedule_flag = getBit(data, &boff, 1);\r
+ b->EIT_present_following_flag = getBit(data, &boff, 1);\r
+ b->running_status = getBit(data, &boff, 3);\r
+ b->free_CA_mode = getBit(data, &boff, 1);\r
+ b->descriptors_loop_length = getBit(data, &boff, 12);\r
+\r
+ return 5;\r
+}\r
+\r
+static void getStr(char *tostr, unsigned char *byte, int *pbit, int len)\r
+{\r
+ char str[MAXSECLEN];\r
+ int pbyte = *pbit / 8;\r
+ unsigned char *fbyte = byte + pbyte;\r
+\r
+ memset(str, 0, sizeof(char) * MAXSECLEN);\r
+ memcpy(str, fbyte, len);\r
+\r
+ *pbit += (len * 8);\r
+\r
+ AribToString(tostr, str, len);\r
+}\r
+\r
+static int parseSVCdesc(unsigned char *data, SVCdesc *desc)\r
+{\r
+ int boff = 0;\r
+ \r
+ memset(desc, 0, sizeof(SVCdesc));\r
+\r
+ desc->descriptor_tag = getBit(data, &boff, 8);\r
+ desc->descriptor_length = getBit(data, &boff, 8);\r
+ desc->service_type = getBit(data, &boff, 8);\r
+ desc->service_provider_name_length = getBit(data, &boff, 8);\r
+ getStr(desc->service_provider_name, data, &boff, desc->service_provider_name_length);\r
+ desc->service_name_length = getBit(data, &boff, 8);\r
+ getStr(desc->service_name, data, &boff, desc->service_name_length);\r
+\r
+ return desc->descriptor_length + 2;\r
+}\r
+\r
+SDT::SDT()\r
+{\r
+// printf("SDT::SDT()\n");\r
+ _service_count = 0;\r
+ _services = NULL;\r
+}\r
+SDT::SDT(SDT &sdt)\r
+{\r
+// printf("SDT::SDT(SDT &)\n");\r
+ _table_id = sdt._table_id;\r
+ _section_syntax_indicator = sdt._section_syntax_indicator;\r
+ _section_length = sdt._section_length;\r
+ _transport_stream_id = sdt._transport_stream_id;\r
+ _version_number = sdt._version_number;\r
+ _current_next_indicator = sdt._current_next_indicator;\r
+ _section_number = sdt._section_number;\r
+ _last_section_number = sdt._last_section_number;\r
+ _original_network_id = sdt._original_network_id;\r
+ _service_count = sdt._service_count;\r
+ _services = (struct _service *)malloc(sizeof(struct _service) * _service_count);\r
+ for (int i = 0; i < _service_count; ++i)\r
+ {\r
+ _services[i]._service_id = sdt._services[i]._service_id;\r
+ _services[i]._EIT_user_defined_flags = sdt._services[i]._EIT_user_defined_flags;\r
+ _services[i]._EIT_schedule_flag = sdt._services[i]._EIT_schedule_flag;\r
+ _services[i]._EIT_present_following_flag = sdt._services[i]._EIT_present_following_flag;\r
+ _services[i]._running_status = sdt._services[i]._running_status;\r
+ _services[i]._free_CA_mode = sdt._services[i]._free_CA_mode;\r
+ _services[i]._descriptors_loop_length = sdt._services[i]._descriptors_loop_length;\r
+ _services[i]._descriptor = NULL;\r
+ if (sdt._services[i]._descriptor != NULL)\r
+ {\r
+ _services[i]._descriptor = (uint8_t *)malloc(_services[i]._descriptors_loop_length);\r
+ memcpy(_services[i]._descriptor, _services[i]._descriptor, _services[i]._descriptors_loop_length);\r
+ }\r
+ _services[i]._desc = NULL;\r
+ if (sdt._services[i]._desc != NULL)\r
+ {\r
+ _services[i]._desc = (SVCdesc *)malloc(sizeof(SVCdesc));\r
+ memcpy(_services[i]._desc, sdt._services[i]._desc, sizeof(SVCdesc));\r
+ }\r
+ }\r
+}\r
+\r
+SDT::~SDT()\r
+{\r
+// printf("SDT::~SDT()\n");\r
+ reset();\r
+}\r
+\r
+bool SDT::decode_section()\r
+{\r
+// printf("SDT::%s\n", __FUNCTION__);\r
+\r
+ int len = 0;\r
+ int loop_len = 0;\r
+ SDThead sdth;\r
+ SDTbody sdtb;\r
+// SVCdesc desc;\r
+\r
+ uint8_t *ptr = &_section[0];\r
+\r
+ /* SDT */\r
+ len = parseSDThead(ptr, &sdth);\r
+ if ((sdth.table_id != 0x42) && (sdth.table_id != 0x46))\r
+ {\r
+ return false;\r
+ }\r
+\r
+ _table_id = sdth.table_id;\r
+\r
+#if 0\r
+ if (_services != NULL)\r
+ {\r
+ for (int i = 0; i < _service_count; ++i)\r
+ {\r
+ if (_services[i]._descriptor != NULL)\r
+ {\r
+ free(_services[i]._descriptor);\r
+ _services[i]._descriptor = NULL;\r
+ }\r
+ if (_services[i]._desc != NULL)\r
+ {\r
+ free(_services[i]._desc);\r
+ _services[i]._desc = NULL;\r
+ }\r
+ }\r
+ free(_services);\r
+ _services = NULL;\r
+ }\r
+ _service_count = 0;\r
+#else\r
+ reset();\r
+#endif\r
+ ptr += len;\r
+ loop_len = sdth.section_length - (len - 3 + 4); // 3: common header, 4:CRC\r
+ while (loop_len > 0)\r
+ {\r
+ len = parseSDTbody(ptr, &sdtb);\r
+ ptr += len;\r
+ loop_len -= len;\r
+\r
+ if (_services == NULL)\r
+ {\r
+ _services = (struct _service *)malloc(sizeof(struct _service));\r
+ }\r
+ else\r
+ {\r
+ _services = (struct _service *)realloc(_services, sizeof(struct _service) * (_service_count + 1));\r
+ }\r
+\r
+ _services[_service_count]._service_id = sdtb.service_id;\r
+ _services[_service_count]._descriptors_loop_length = 0;\r
+ _services[_service_count]._descriptor = NULL;\r
+ _services[_service_count]._desc = (SVCdesc *)malloc(sizeof(SVCdesc));\r
+\r
+ parseSVCdesc(ptr, _services[_service_count]._desc);\r
+\r
+ ++_service_count;\r
+\r
+ ptr += sdtb.descriptors_loop_length;\r
+ loop_len -= sdtb.descriptors_loop_length;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+void SDT::reset()\r
+{\r
+ if (_services != NULL)\r
+ {\r
+ for (int i = 0; i < _service_count; ++i)\r
+ {\r
+ if (_services[i]._descriptor != NULL)\r
+ {\r
+ free(_services[i]._descriptor);\r
+ _services[i]._descriptor = NULL;\r
+ }\r
+ if (_services[i]._desc != NULL)\r
+ {\r
+ free(_services[i]._desc);\r
+ _services[i]._desc = NULL;\r
+ }\r
+ }\r
+ free(_services);\r
+ _services = NULL;\r
+ }\r
+ _service_count = 0;\r
+}\r
+\r
+} // TS\r
+} // MPEG2\r
--- /dev/null
+/**
+ * @file SDT.h
+ *
+ */
+
+#pragma once
+
+#include "mpeg2/ts/Table.h"
+
+namespace MPEG2
+{
+namespace TS
+{
+
+/*
+#define MPEG2_TS_SDT_SELF "Self"
+#define MPEG2_TS_SDT_OTHER "Other"
+#define MPEG2_TS_SDT_SERVICES "Services"
+#define MPEG2_TS_SDT_SERVICE_ID "ServiceID"
+#define MPEG2_TS_SDT_TYPE "Type"
+#define MPEG2_TS_SDT_NAME "Name"
+*/
+
+#define MAXSECLEN 4096
+
+typedef struct _SDThead {
+ char table_id;
+ int section_syntax_indicator;
+ int reserved_future_use1;
+ int reserved1;
+ int section_length;
+ int transport_stream_id;
+ int reserved2;
+ int version_number;
+ int current_next_indicator;
+ int section_number;
+ int last_section_number;
+ int original_network_id;
+ int reserved_future_use2;
+} SDThead;
+
+typedef struct _SDTbody {
+ int service_id;
+ int reserved_future_use1;
+ int EIT_user_defined_flags;
+ int EIT_schedule_flag;
+ int EIT_present_following_flag;
+ int running_status;
+ int free_CA_mode;
+ int descriptors_loop_length;
+} SDTbody;
+
+typedef struct _SVCdesc {
+ int descriptor_tag;
+ int descriptor_length;
+ int service_type;
+ int service_provider_name_length;
+ char service_provider_name[MAXSECLEN];
+ int service_name_length;
+ char service_name[MAXSECLEN];
+} SVCdesc;
+
+class SDT : public Table
+{
+protected:
+ bool decode_section();
+
+public:
+ uint8_t _table_id; // 8
+ uint8_t _section_syntax_indicator; // 1
+ // 1 '1'
+ // 2 '11'
+ uint16_t _section_length; // 12
+ uint16_t _transport_stream_id; // 16
+ // 2 '11'
+ uint8_t _version_number; // 5
+ uint8_t _current_next_indicator; // 1
+ uint8_t _section_number; // 8
+ uint8_t _last_section_number; // 8
+ uint16_t _original_network_id; // 16
+ // 8
+ uint16_t _service_count;
+ struct _service
+ {
+ uint16_t _service_id; // 16
+ // 3
+ uint8_t _EIT_user_defined_flags; // 3
+ uint8_t _EIT_schedule_flag; // 1
+ uint8_t _EIT_present_following_flag; // 1
+ uint8_t _running_status; // 3
+ uint8_t _free_CA_mode; // 1
+ uint16_t _descriptors_loop_length; // 12
+ uint8_t * _descriptor; // N
+
+ SVCdesc * _desc;
+ } *_services;
+
+public:
+ SDT();
+ SDT(SDT &sdt);
+ ~SDT();
+ void reset();
+};
+
+} // TS
+} // MPEG2
--- /dev/null
+/*\r
+ * Table.cpp\r
+ */\r
+\r
+#include "b25/aribstr.h"\r
+#include "mpeg2/ts/Header.h"\r
+#include "mpeg2/ts/Table.h"\r
+\r
+namespace MPEG2\r
+{\r
+namespace TS\r
+{\r
+\r
+Table::Table()\r
+{\r
+ _pid = 0xFFFF;\r
+ _length = 0;\r
+}\r
+\r
+Table::~Table()\r
+{\r
+}\r
+\r
+//\r
+// CRC\r
+//\r
+int Table::GetCrc32(\r
+ unsigned char* data, // [in] CRC data\r
+ int len) // [in] CRC data length\r
+{\r
+ int crc;\r
+ int i, j;\r
+\r
+ crc = 0xFFFFFFFF;\r
+ for (i = 0; i < len; i++)\r
+ {\r
+ char x;\r
+ x = data[i];\r
+\r
+ for (j = 0; j < 8; j++)\r
+ {\r
+ int c;\r
+ int bit;\r
+\r
+ bit = (x >> (7 - j)) & 0x1;\r
+\r
+ c = 0;\r
+ if (crc & 0x80000000)\r
+ {\r
+ c = 1;\r
+ }\r
+\r
+ crc = crc << 1;\r
+\r
+ if (c ^ bit)\r
+ {\r
+ crc ^= 0x04C11DB7;\r
+ }\r
+\r
+ crc &= 0xFFFFFFFF;\r
+ }\r
+ }\r
+\r
+ return crc;\r
+}\r
+\r
+bool Table::decode(Header *header, uint8_t *packet)\r
+{\r
+ bool result = false;\r
+\r
+ if (header->_adaptation_field_control != 0x02)\r
+ {\r
+ uint8_t offset = 0x04;\r
+ if (header->_adaptation_field_control == 0x03)\r
+ {\r
+ offset = offset + packet[0x04];\r
+ }\r
+\r
+ if (header->_payload_unit_start)\r
+ {\r
+ if (_length != 0)\r
+ {\r
+ if (packet[offset] != 0)\r
+ {\r
+ memcpy(&_section[_length], &packet[offset + 1], packet[offset]);\r
+ _length += packet[offset];\r
+ }\r
+ result = decode_section();\r
+ _length = 0;\r
+ }\r
+\r
+ offset += (1 + packet[offset]);\r
+ }\r
+\r
+ memcpy(&_section[_length], &packet[offset], PACKET_SIZE - offset);\r
+ _length += (PACKET_SIZE - offset);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+void Table::reset()\r
+{\r
+ _pid = 0xFFFF;\r
+ _length = 0;\r
+ memset(_section, 0x00, sizeof(_section));\r
+}\r
+\r
+static uint16_t parseServiceDescriptor(uint8_t *buf, ServiceDescriptor *service)\r
+{\r
+ service->_descriptor_tag = buf[0];\r
+ service->_descriptor_length = buf[1];\r
+ service->_service_type = buf[2];\r
+ service->_service_provider_name_length = buf[3];\r
+ if (service->_service_provider_name_length > 0)\r
+ {\r
+ memcpy(service->_service_provider_name, &buf[4], service->_service_provider_name_length);\r
+ }\r
+ service->_service_name_length = buf[4 + service->_service_provider_name_length];\r
+ if (service->_service_name_length > 0)\r
+ {\r
+ memcpy(service->_service_name, &buf[5 + service->_service_provider_name_length], service->_service_name_length);\r
+ }\r
+ return service->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseShortEventDescriptor(uint8_t *buf, ShortEventDescriptor *short_event)\r
+{\r
+ short_event->_descriptor_tag = buf[0];\r
+ short_event->_descriptor_length = buf[1];\r
+ memcpy(short_event->_ISO_639_language_code, &buf[2], 3);\r
+ short_event->_event_name_length = buf[5];\r
+ if (short_event->_event_name_length > 0)\r
+ {\r
+ memcpy(short_event->_event_name, &buf[6], short_event->_event_name_length);\r
+ }\r
+ short_event->_text_length = buf[6 + short_event->_event_name_length];\r
+ if (short_event->_text_length > 0)\r
+ {\r
+ memcpy(short_event->_text, &buf[7 + short_event->_event_name_length], short_event->_text_length);\r
+ }\r
+ return short_event->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseExtendedEventDescriptor(uint8_t *buf, ExtendedEventDescriptor *extended)\r
+{\r
+ extended->_descriptor_tag = buf[0x00];\r
+ extended->_descriptor_length = buf[0x01];\r
+ extended->_descriptor_number = (buf[0x02] & 0xF0) >> 4;\r
+ extended->_last_descriptor_number = buf[0x02] & 0x0F;\r
+ memcpy(&extended->_ISO_639_language_code[0], &buf[0x03], 3);\r
+ extended->_length_of_items = buf[0x06];\r
+ extended->_item_count = 0;\r
+ if ((extended->_length_of_items + 6) <= extended->_descriptor_length)\r
+ {\r
+ extended->_text_length = buf[extended->_length_of_items + 7];\r
+ if ((extended->_text_length + extended->_length_of_items + 6) == extended->_descriptor_length)\r
+ {\r
+ memcpy(&extended->_text[0], &buf[extended->_length_of_items + 7], extended->_text_length);\r
+\r
+ int item_remain = extended->_length_of_items;\r
+ int item_offset = 0x07;\r
+ while (item_remain >= 2)\r
+ {\r
+ extended->_items[extended->_item_count]._item_description_length = buf[item_offset++];\r
+ if (extended->_items[extended->_item_count]._item_description_length > 0)\r
+ {\r
+ memcpy(&extended->_items[extended->_item_count]._item_description[0], &buf[item_offset],\r
+ extended->_items[extended->_item_count]._item_description_length);\r
+ item_offset += extended->_items[extended->_item_count]._item_description_length;\r
+ }\r
+ item_remain -= (1 + extended->_items[extended->_item_count]._item_description_length);\r
+ if (item_remain < 1)\r
+ {\r
+ printf("%s item desc len error.\n", __FUNCTION__);\r
+ break;\r
+ }\r
+ \r
+ extended->_items[extended->_item_count]._item_length = buf[item_offset++];\r
+ if (extended->_items[extended->_item_count]._item_length > 0)\r
+ {\r
+ memcpy(&extended->_items[extended->_item_count]._item[0], &buf[item_offset],\r
+ extended->_items[extended->_item_count]._item_length);\r
+ item_offset += extended->_items[extended->_item_count]._item_length;\r
+ }\r
+ item_remain -= (1 + extended->_items[extended->_item_count]._item_length);\r
+ if ((item_remain < 0) || (item_remain == 1))\r
+ {\r
+ printf("%s item len error. %d\n", __FUNCTION__, item_remain);\r
+ break;\r
+ }\r
+\r
+ ++extended->_item_count;\r
+ }\r
+ }\r
+ }\r
+\r
+ return extended->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseComponentDescriptor(uint8_t *buf, ComponentDescriptor *component)\r
+{\r
+ component->_descriptor_tag = buf[0];\r
+ component->_descriptor_length = buf[1];\r
+\r
+ return component->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseContentDescriptor(uint8_t *buf, ContentDescriptor *content)\r
+{\r
+ content->_descriptor_tag = buf[0];\r
+ content->_descriptor_length = buf[1];\r
+ for (int i = 0; i < (content->_descriptor_length / 2); ++i)\r
+ {\r
+ content->_contents[i]._content_nibble_level_1 = (buf[i * 2 + 0x02] & 0xF0) >> 4;\r
+ content->_contents[i]._content_nibble_level_2 = buf[i * 2 + 0x02] & 0x0F;\r
+ content->_contents[i]._user_nibble_1 = (buf[i * 2 + 0x03] & 0xF0) >> 4;\r
+ content->_contents[i]._user_nibble_2 = buf[i * 2 + 0x03] & 0x0F;\r
+ }\r
+ return content->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseDigitalCopyControlDescriptor(uint8_t *buf, DigitalCopyControlDescriptor *digital_copy_control)\r
+{\r
+ digital_copy_control->_descriptor_tag = buf[0];\r
+ digital_copy_control->_descriptor_length = buf[1];\r
+\r
+ return digital_copy_control->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseAudioComponentDescriptor(uint8_t *buf, AudioComponentDescriptor *audio_component)\r
+{\r
+ audio_component->_descriptor_tag = buf[0];\r
+ audio_component->_descriptor_length = buf[1];\r
+ audio_component->_stream_content = buf[2] & 0x0F;\r
+ audio_component->_component_type = buf[3];\r
+ audio_component->_component_tag = buf[4];\r
+ audio_component->_stream_type = buf[5];\r
+ audio_component->_simulcast_group_tag = buf[6];\r
+ audio_component->_ES_multi_lingual_flag = buf[7] >> 7;\r
+ audio_component->_main_component_flag = (buf[7] >> 6) & 0x01;\r
+ audio_component->_quality_indicator = (buf[7] >> 4) & 0x03;\r
+ audio_component->_sampling_rate = (buf[7] >> 1) & 0x07;\r
+ memcpy(audio_component->_ISO_639_language_code, &buf[8], 3);\r
+ if (audio_component->_ES_multi_lingual_flag == 1)\r
+ {\r
+ memcpy(audio_component->_ISO_639_language_code_2, &buf[11], 3);\r
+ }\r
+ uint8_t cpylen = audio_component->_descriptor_length - (9 + audio_component->_ES_multi_lingual_flag * 3);\r
+ memcpy(audio_component->_text_char, &buf[11 + audio_component->_ES_multi_lingual_flag * 3], cpylen);\r
+ return audio_component->_descriptor_length + 2;\r
+}\r
+\r
+static uint16_t parseSeriesDescriptor(uint8_t *buf, SeriesDescriptor *series)\r
+{\r
+ series->_descriptor_tag = buf[0];\r
+ series->_descriptor_length = buf[1];\r
+\r
+ return series->_descriptor_length + 2;\r
+}\r
+\r
+uint16_t Table::parseDescriptor(uint8_t *buf, uint16_t length, Descriptor *descriptor)\r
+{\r
+ uint16_t result = 0;\r
+\r
+ descriptor->_other._descriptor_tag = buf[0x00];\r
+ descriptor->_other._descriptor_length = buf[0x01];\r
+\r
+ // length check\r
+ if ((descriptor->_other._descriptor_length + 2) <= length)\r
+ {\r
+ switch (descriptor->_other._descriptor_tag)\r
+ {\r
+ case TAG_SERVICE_DESCRIPTOR:\r
+ result = parseServiceDescriptor(buf, &descriptor->_service);\r
+ break;\r
+\r
+ case TAG_SHORT_EVENT_DESCRIPTOR:\r
+ result = parseShortEventDescriptor(buf, &descriptor->_short_event);\r
+ break;\r
+\r
+ case TAG_EXTENDED_EVENT_DESCRIPTOR:\r
+ result = parseExtendedEventDescriptor(buf, &descriptor->_extended_event);\r
+ break;\r
+\r
+ case TAG_COMPONENT_DESCRIPTOR:\r
+ result = parseComponentDescriptor(buf, &descriptor->_component);\r
+ break;\r
+\r
+ case TAG_CONTENT_DESCRIPTOR:\r
+ result = parseContentDescriptor(buf, &descriptor->_content);\r
+ break;\r
+\r
+ case TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR:\r
+ result = parseDigitalCopyControlDescriptor(buf, &descriptor->_digital_copy_control);\r
+ break;\r
+\r
+ case TAG_AUDIO_COMPONENT_DESCRIPTOR:\r
+ result = parseAudioComponentDescriptor(buf, &descriptor->_audio_component);\r
+ break;\r
+\r
+ case TAG_SERIES_DESCRIPTOR:\r
+ result = parseSeriesDescriptor(buf, &descriptor->_series);\r
+ break;\r
+\r
+ default:\r
+ memcpy(&descriptor->_other._descriptor[0], &buf[0x02], descriptor->_other._descriptor_length);\r
+ result = descriptor->_other._descriptor_length + 2;\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ printf("%s() length = %d\n", __FUNCTION__, length);\r
+ printf("%s() descriptor_tag = %d\n", __FUNCTION__, descriptor->_other._descriptor_tag);\r
+ printf("%s() descriptor_length error. %d\n", __FUNCTION__, descriptor->_other._descriptor_length);\r
+ result = 0;\r
+// abort();\r
+ }\r
+ return result;\r
+}\r
+\r
+} // TS\r
+} // MPEG2\r
--- /dev/null
+/*\r
+ * Table.h\r
+ */\r
+\r
+#pragma once\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+\r
+#include "mpeg2/ts/Header.h"\r
+\r
+namespace MPEG2\r
+{\r
+namespace TS\r
+{\r
+\r
+static const int MAX_SECT_LEN = 4096;\r
+static const int MAX_DESC_LEN = 255;\r
+\r
+enum\r
+{\r
+ TABLE_ID_PAT = 0x00,\r
+ TABLE_ID_PMT = 0x02\r
+};\r
+\r
+enum\r
+{\r
+ TAG_BOUQUET_NAME_DESCRIPTOR = 0x47,\r
+ TAG_SERVICE_DESCRIPTOR = 0x48,\r
+ TAG_SHORT_EVENT_DESCRIPTOR = 0x4D,\r
+ TAG_EXTENDED_EVENT_DESCRIPTOR = 0x4E,\r
+ TAG_COMPONENT_DESCRIPTOR = 0x50,\r
+ TAG_CONTENT_DESCRIPTOR = 0x54,\r
+ TAG_EVENT_GROUP_DESCRIPTOR = 0xD6,\r
+ TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR = 0xC1,\r
+ TAG_AUDIO_COMPONENT_DESCRIPTOR = 0xC4,\r
+ TAG_DATA_CONTENT_DESCRIPTOR = 0xC7,\r
+ TAG_SERIES_DESCRIPTOR = 0xD5\r
+};\r
+\r
+// 6.2.1 Bouquet name descriptor\r
+typedef struct _BouquetNameDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _descriptor[MAX_DESC_LEN]; // 8 x N\r
+} BouquetNameDescriptor;\r
+\r
+// 6.2.3 Component descriptor\r
+typedef struct _ComponentDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _reserved_future_use; // 4\r
+ uint8_t _stream_content; // 4\r
+ uint8_t _component_type; // 8\r
+ uint8_t _component_tag; // 8\r
+ uint8_t _ISO_639_language_code[3]; // 24\r
+ uint8_t _text_char[MAX_DESC_LEN]; // 8 x N\r
+} ComponentDescriptor;\r
+\r
+// 6.2.4 Content descriptor\r
+typedef struct _ContentDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ struct\r
+ {\r
+ uint8_t _content_nibble_level_1; // 4\r
+ uint8_t _content_nibble_level_2; // 4\r
+ uint8_t _user_nibble_1; // 4\r
+ uint8_t _user_nibble_2; // 4\r
+ } _contents[MAX_DESC_LEN/2]; // 16 x N\r
+} ContentDescriptor;\r
+\r
+// 6.2.7 Extended event descriptor\r
+typedef struct _ExtendedEventDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _descriptor_number; // 4\r
+ uint8_t _last_descriptor_number; // 4\r
+ uint8_t _ISO_639_language_code[3]; // 24\r
+ uint8_t _length_of_items; // 8\r
+ uint8_t _item_count;\r
+ struct\r
+ {\r
+ uint8_t _item_description_length; // 8\r
+ uint8_t _item_description[MAX_DESC_LEN]; // 8 x N\r
+ uint8_t _item_length; // 8\r
+ uint8_t _item[MAX_DESC_LEN]; // 8 x N\r
+ } _items[MAX_DESC_LEN/2];\r
+ uint8_t _text_length; // 8\r
+ uint8_t _text[MAX_DESC_LEN]; // 8 x N\r
+} ExtendedEventDescriptor;\r
+\r
+// 6.2.13 Service descriptor\r
+typedef struct _ServiceDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _service_type; // 8\r
+ uint8_t _service_provider_name_length; // 8\r
+ uint8_t _service_provider_name[MAX_DESC_LEN]; // 8 x N\r
+ uint8_t _service_name_length; // 8\r
+ uint8_t _service_name[MAX_DESC_LEN]; // 8 x N\r
+} ServiceDescriptor;\r
+\r
+// 6.2.15 Short event descriptor\r
+typedef struct _ShortEventDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _ISO_639_language_code[3]; // 24\r
+ uint8_t _event_name_length; // 8\r
+ uint8_t _event_name[MAX_DESC_LEN]; // 8 x N\r
+ uint8_t _text_length; // 8\r
+ uint8_t _text[MAX_DESC_LEN]; // 8 x N\r
+} ShortEventDescriptor;\r
+\r
+// 6.2.23 Digital copy control descriptor\r
+typedef struct _DigitalCopyControlDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+\r
+} DigitalCopyControlDescriptor;\r
+\r
+// 6.2.26 Audio compoenent descriptor\r
+typedef struct _AudioComponentDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _reserved_future_use; // 4\r
+ uint8_t _stream_content; // 4\r
+ uint8_t _component_type; // 8\r
+ uint8_t _component_tag; // 8\r
+ uint8_t _stream_type; // 8\r
+ uint8_t _simulcast_group_tag; // 8\r
+ uint8_t _ES_multi_lingual_flag; // 1\r
+ uint8_t _main_component_flag; // 1\r
+ uint8_t _quality_indicator; // 2\r
+ uint8_t _sampling_rate; // 3\r
+ uint8_t _reserved_future_use_2; // 1\r
+ uint8_t _ISO_639_language_code[3]; // 24\r
+ uint8_t _ISO_639_language_code_2[3]; // 24 if (ES_multi_lingual_flag == 1)\r
+ uint8_t _text_char[MAX_DESC_LEN]; // 8 x N\r
+} AudioComponentDescriptor;\r
+\r
+// 6.2.33 Series descriptor\r
+typedef struct _SeriesDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint16_t _series_id; // 16\r
+ uint8_t _repeat_label; // 4\r
+ uint8_t _program_pattern; // 3\r
+ uint8_t _expire_date_valid_flag; // 1\r
+ uint16_t _expire_date; // 16\r
+ uint16_t _episode_number; // 12\r
+ uint16_t _last_episode_number; // 12\r
+ uint8_t _series_name[MAX_DESC_LEN]; // 8 x N\r
+} SeriesDescriptor;\r
+\r
+\r
+typedef struct _OtherDescriptor\r
+{\r
+ uint8_t _descriptor_tag; // 8\r
+ uint8_t _descriptor_length; // 8\r
+ uint8_t _descriptor[MAX_DESC_LEN]; // 8 x N\r
+} OtherDescriptor;\r
+\r
+typedef union _Descriptor\r
+{\r
+ uint8_t _descriptor_tag;\r
+ BouquetNameDescriptor _bouquet_name;\r
+ ComponentDescriptor _component;\r
+ ContentDescriptor _content;\r
+ ExtendedEventDescriptor _extended_event;\r
+ ServiceDescriptor _service;\r
+ ShortEventDescriptor _short_event;\r
+ DigitalCopyControlDescriptor _digital_copy_control;\r
+ AudioComponentDescriptor _audio_component;\r
+ SeriesDescriptor _series;\r
+ OtherDescriptor _other;\r
+} Descriptor;\r
+\r
+class Table\r
+{\r
+protected:\r
+ uint16_t _pid;\r
+ uint16_t _length;\r
+ uint8_t _section[MAX_SECT_LEN];\r
+\r
+ virtual bool decode_section() = 0;\r
+\r
+public:\r
+ Table();\r
+ virtual ~Table();\r
+ bool decode(Header *header, uint8_t *packet);\r
+ void reset();\r
+\r
+ static uint16_t parseDescriptor(uint8_t *buf, uint16_t length, Descriptor *descriptor);\r
+\r
+\r
+public:\r
+ static int GetCrc32(unsigned char* data, int length);\r
+};\r
+\r
+} // TS\r
+} // MPEG2\r
--- /dev/null
+//\r
+// HTTPDaemon.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+#include "Raym/Raym.h"\r
+#include "net/HTTPDaemon.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+DEFINE_STATIC_MUTEX(mutex_);\r
+static HTTPResponse *unnecessary_ = NULL;\r
+\r
+HTTPDaemon::HTTPDaemon()\r
+{\r
+ DebugLog2("HTTPDaemon::HTTPDaemon()");\r
+\r
+ _port = -1;\r
+ _backlog = -1;\r
+ _state = ST_IDLE;\r
+ _rootPath = NULL;\r
+ _delegate = NULL;\r
+ _sockets = NULL;\r
+\r
+}\r
+\r
+HTTPDaemon::~HTTPDaemon()\r
+{\r
+ stop();\r
+\r
+ RELEASE(_rootPath);\r
+ RELEASE(_sockets);\r
+\r
+ DebugLog2("HTTPDaemon::~HTTPDaemon()");\r
+}\r
+\r
+HTTPDaemon *HTTPDaemon::alloc()\r
+{\r
+ return new HTTPDaemon();\r
+}\r
+\r
+HTTPDaemon *HTTPDaemon::initWithPort(int port, int backlog)\r
+{\r
+ DebugLog2("HTTPDaemon::initWithPort()");\r
+\r
+ _port = port;\r
+ _backlog = backlog;\r
+ _sockets = Array::alloc()->initWithCapacity(0);\r
+ return this;\r
+}\r
+\r
+void HTTPDaemon::setDelegate(HTTPDaemonDelegate *delegate)\r
+{\r
+ DebugLog2("HTTPDaemon::setDelegate()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _delegate = delegate;\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+void HTTPDaemon::setRootPath(String *path)\r
+{\r
+ DebugLog2("HTTPDaemon::setRootPath()");\r
+\r
+ RELEASE(_rootPath);\r
+ if (path != NULL)\r
+ {\r
+ _rootPath = path;\r
+ _rootPath->retain();\r
+ }\r
+}\r
+\r
+String *HTTPDaemon::rootPath()\r
+{\r
+ return _rootPath;\r
+}\r
+\r
+HTTPResponse *HTTPDaemon::responseWithReason(String *reason, int status, String *version)\r
+{\r
+ DebugLog2("HTTPDaemon::responseWithReason()");\r
+\r
+ HTTPResponse *resp = HTTPResponse::alloc()->init();\r
+ resp->setVersion(version);\r
+ resp->setReason(reason);\r
+ resp->setStatus(status);\r
+\r
+ // header & body\r
+ InternetTextMessageHeader * header = NULL;\r
+ InternetTextMessageBody * body = NULL;\r
+ switch (status)\r
+ {\r
+ case HTTP_STATUS_NO_CONTENT:\r
+ {\r
+ header = InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(String::stringWithUTF8String("close"), String::stringWithUTF8String("Connection"));\r
+ }\r
+ break;\r
+\r
+ case HTTP_STATUS_INTERNAL_SERVER_ERROR:\r
+ {\r
+ // header\r
+ header = InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(String::stringWithUTF8String("close"), String::stringWithUTF8String("Connection"));\r
+\r
+ // body\r
+ char html[1024];\r
+ sprintf_s(html, 1024, "<html><head><title>%s</title></head><body>%s</body></html>", reason->cString(), reason->cString());\r
+ body = InternetTextMessageBody::alloc()->initWithString(String::stringWithUTF8String(html));\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ // Contet-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", body->body()->length()), "Content-Length");\r
+\r
+ // message\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+\r
+ resp->setMessage(message);\r
+ resp->autorelease();\r
+ RELEASE(message);\r
+\r
+ return resp;\r
+}\r
+\r
+HTTPResponse *HTTPDaemon::responseWithPath(String *path, HTTPRequest *request)\r
+{\r
+ DebugLog2("HTTPDaemon::responseWithPath()");\r
+\r
+ HTTPResponse *result = NULL;\r
+ if ((path != NULL) && (request != NULL))\r
+ {\r
+ Data *bodyData = Data::alloc()->initWithContentsOfFile(path);\r
+ if (bodyData != NULL)\r
+ {\r
+ // header\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->init();\r
+ // Date\r
+ // Server\r
+ // Content-Encoding\r
+ // Last-Modified\r
+ // Content-Type\r
+ String *ext = path->pathExtension()->lowercaseString();\r
+ if (ext->isEqualToString("htm") || ext->isEqualToString("html"))\r
+ {\r
+ header->setFieldBodyWithName("text/html", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("jpg"))\r
+ {\r
+ header->setFieldBodyWithName("image/jpeg", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("png"))\r
+ {\r
+ header->setFieldBodyWithName("image/png", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("gif"))\r
+ {\r
+ header->setFieldBodyWithName("image/gif", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("js"))\r
+ {\r
+ header->setFieldBodyWithName("text/javascript", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("css"))\r
+ {\r
+ header->setFieldBodyWithName("text/css", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("log"))\r
+ {\r
+ header->setFieldBodyWithName("text/plane", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("m3u8"))\r
+ {\r
+ header->setFieldBodyWithName("application/x-mpegURL", "Content-Type");\r
+ }\r
+ else if (ext->isEqualToString("ts"))\r
+ {\r
+ header->setFieldBodyWithName("video/mp2t", "Content-Type");\r
+ }\r
+ else\r
+ {\r
+ header->setFieldBodyWithName("application/octet-stream", "Content-Type");\r
+ }\r
+ // Connection\r
+ // Transfer-Encoding\r
+ // Content-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", bodyData->length()), "Content-Length");\r
+\r
+ // body\r
+ InternetTextMessageBody *body = InternetTextMessageBody::alloc()->initWithData(bodyData);\r
+ RELEASE(bodyData);\r
+\r
+ // message\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+ if (message != NULL)\r
+ {\r
+// result = HTTPResponse::response();\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("HTTPDaemon::responseWithPath(): date read error.");\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *HTTPDaemon::responseOfUnnecessary()\r
+{\r
+ mutex_.lock();\r
+ if (unnecessary_ == NULL)\r
+ {\r
+ unnecessary_ = HTTPResponse::alloc();\r
+ ((Object *)unnecessary_)->init();\r
+ ((Object *)unnecessary_)->autorelease(true);\r
+ }\r
+ mutex_.unlock();\r
+\r
+ return unnecessary_;\r
+}\r
+\r
+String *HTTPDaemon::reasonForStatus(int status)\r
+{\r
+ DebugLog2("HTTPDaemon::reasonForStatus()");\r
+\r
+ const char *result = NULL;\r
+ switch (status)\r
+ {\r
+ // Informational 1xx\r
+ case 100: result = "Continue"; break;\r
+ case 101: result = "Swithing Protocols"; break;\r
+ // Successful 2xx\r
+ case 200: result = "OK"; break;\r
+ case 201: result = "Created"; break;\r
+ case 202: result = "Accepted"; break;\r
+ case 203: result = "Non-Authoritative Information"; break;\r
+ case 204: result = "No Content"; break;\r
+ case 205: result = "Reset Content"; break;\r
+ case 206: result = "Partial Content"; break;\r
+ // Redirection 3xx\r
+ case 300: result = "Multiple Choices"; break;\r
+ case 301: result = "Moved Permanently"; break;\r
+ case 302: result = "Found"; break;\r
+ case 303: result = "See Other"; break;\r
+ case 304: result = "Not Modified"; break;\r
+ case 305: result = "Use Proxy"; break;\r
+ case 306: result = "(Unused)"; break;\r
+ case 307: result = "Temporary Redirect"; break;\r
+ // Client Error 4xx\r
+ case 400: result = "Bad Request"; break;\r
+ case 401: result = "Unauthorized"; break;\r
+ case 402: result = "Payment Required"; break;\r
+ case 403: result = "Forbidden"; break;\r
+ case 404: result = "Not Found"; break;\r
+ case 405: result = "Method Not Allowed"; break;\r
+ case 406: result = "Not Acceptable"; break;\r
+ case 407: result = "Proxy Authentication Required"; break;\r
+ case 408: result = "Request Timeout"; break;\r
+ case 409: result = "Conflict"; break;\r
+ case 410: result = "Gone"; break;\r
+ case 411: result = "Length Required"; break;\r
+ case 412: result = "Precondition Failed"; break;\r
+ case 413: result = "Request Entity Too Large"; break;\r
+ case 414: result = "Request-URI Too Long"; break;\r
+ case 415: result = "Unsupported Media Type"; break;\r
+ case 416: result = "Requested Range Not Satisfiable"; break;\r
+ case 417: result = "Expectation Failed"; break;\r
+ // Server Error 5xx\r
+ case 500: result = "Internal Server Error"; break;\r
+ case 501: result = "Not Implemented"; break;\r
+ case 502: result = "Bad Gateway"; break;\r
+ case 503: result = "Service Unavailable"; break;\r
+ case 504: result = "Gateway Timeout"; break;\r
+ case 505: result = "HTTP Version Not Supported"; break;\r
+ default: break;\r
+ }\r
+ return String::stringWithUTF8String(result);\r
+}\r
+\r
+unsigned __stdcall HTTPDaemon_session(void *arg)\r
+{\r
+ HTTPDaemonSessionArgs *session = (HTTPDaemonSessionArgs *)arg;\r
+ session->_daemon->session(session->_sock, &session->_client);\r
+ closesocket(session->_sock);\r
+ delete session;\r
+ return 0;\r
+}\r
+\r
+void HTTPDaemon::session(SOCKET sock, struct sockaddr_in *client)\r
+{\r
+ DebugLog0("session start. sock = %d", sock);\r
+\r
+ DebugLog2("HTTPDaemon::session()");\r
+\r
+ Number *num_sock = Number::alloc()->initWithInt((int)sock);\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _sockets->addObject(num_sock);\r
+ DebugLog0("_sockets.count() = %d", _sockets->count());\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ while (true)\r
+ {\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+ bool done;\r
+\r
+ HTTPResponse *response = NULL;\r
+ DebugLog3("before request()");\r
+ HTTPRequest *request;\r
+ if (_delegate != NULL)\r
+ {\r
+ request = _delegate->readRequest(sock);\r
+ }\r
+ else\r
+ {\r
+ request = HTTPRequest::requestWithSocket(sock);\r
+ }\r
+ DebugLog3("after request()");\r
+ if (request != NULL)\r
+ {\r
+ if (_delegate != NULL)\r
+ {\r
+ response = _delegate->request(request, sock, client);\r
+ }\r
+\r
+ if ((response == NULL) && (request->method()->isEqualToString("GET") || request->method()->isEqualToString("HEAD")))\r
+ {\r
+ if (_rootPath != NULL)\r
+ {\r
+ String *path = _rootPath->stringByAppendingPathComponent(request->URI());\r
+ //path = path->stringByAbbreviatingWithTildeInPath();\r
+ //path = path->stringByStandardizingPath();\r
+ if (path->hasPrefix(_rootPath))\r
+ {\r
+ FileManager *fm = FileManager::defaultManager();\r
+ bool isDir = false;\r
+ if (fm->fileExistsAtPath(path, &isDir))\r
+ {\r
+ if ((!isDir) && !(request->URI()->hasSuffix("/")))\r
+ {\r
+ String *ext = path->pathExtension()->lowercaseString();\r
+ if (ext->isEqualToString("htm") ||\r
+ ext->isEqualToString("html") ||\r
+ ext->isEqualToString("jpg") ||\r
+ ext->isEqualToString("png") ||\r
+ ext->isEqualToString("gif") ||\r
+ ext->isEqualToString("js") ||\r
+ ext->isEqualToString("manifest") ||\r
+ ext->isEqualToString("gtpl") ||\r
+ ext->isEqualToString("css"))\r
+ {\r
+ response = responseWithPath(path, request);\r
+ if (response == NULL)\r
+ {\r
+ DebugLog0("error: %s\n", path->cString());\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("unsupported type: %s\n", ext->cString());\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("not exists: %s\n", path->cString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (response == NULL)\r
+ {\r
+ DebugLog3("response == NULL");\r
+ String *ver;\r
+ if (request == NULL)\r
+ {\r
+ ver = String::stringWithUTF8String("HTTP/1.1");\r
+ }\r
+ else\r
+ {\r
+ ver = request->version();\r
+ }\r
+\r
+ int status;\r
+ if (request == NULL)\r
+ {\r
+ DebugLog0("request == NULL");\r
+ }\r
+ else if (request->method() == NULL)\r
+ {\r
+ DebugLog0("method == NULL");\r
+ }\r
+ if (request->method()->isEqualToString("GET") || request->method()->isEqualToString("HEAD"))\r
+ {\r
+ status = HTTP_STATUS_INTERNAL_SERVER_ERROR;\r
+ }\r
+ else if (request->method()->isEqualToString("POST"))\r
+ {\r
+ status = HTTP_STATUS_NO_CONTENT;\r
+ }\r
+ else\r
+ {\r
+ status = HTTP_STATUS_INTERNAL_SERVER_ERROR;\r
+ }\r
+ response = responseWithReason(reasonForStatus(status), status, ver);\r
+ }\r
+\r
+ if (response != responseOfUnnecessary())\r
+ {\r
+ // status line\r
+ char statusLine[256];\r
+ sprintf_s(statusLine, sizeof(statusLine), "%s %03d %s\r\n", response->version()->cString(), response->status(), response->reason()->cString());\r
+ send(sock, statusLine, (int)strlen(statusLine), 0);\r
+\r
+ InternetTextMessage *message = response->message();\r
+ if (message != NULL)\r
+ {\r
+ // response header\r
+ InternetTextMessageHeader *header = message->header();\r
+ if (header != NULL)\r
+ {\r
+ Array *fieldNames = header->fieldNames();\r
+ for (uint i = 0; i < fieldNames->count(); ++i)\r
+ {\r
+ String *name = (String *)fieldNames->objectAtIndex(i);\r
+ char field[16384];\r
+ sprintf_s(field, sizeof(field), "%s: %s\r\n", name->cString(), header->fieldBodyForName(name)->cString());\r
+\r
+ DebugLog2("send response header");\r
+ send(sock, field, (int)strlen(field), 0);\r
+ }\r
+ }\r
+\r
+ send(sock, "\r\n", 2, 0);\r
+\r
+ if (!request->method()->isEqualToString("HEAD"))\r
+ {\r
+ // response entity\r
+ InternetTextMessageBody *body = message->body();\r
+ if (body != NULL)\r
+ {\r
+ const char *ptr = NULL;\r
+ UInteger length;\r
+ Data *data = body->data();\r
+ if (data != NULL)\r
+ {\r
+ ptr = (const char *)data->bytes();\r
+ length = data->length();\r
+ }\r
+ else if (body->body() != NULL)\r
+ {\r
+ String *str = body->body();\r
+ ptr = str->cString();\r
+ length = str->length();\r
+ }\r
+ if (ptr != NULL)\r
+ {\r
+ UInteger offset = 0;\r
+ while (offset < length)\r
+ {\r
+ int len = ((length - offset) > 16384) ? 16384 : (int)(length - offset);\r
+ DebugLog2("send response entity");\r
+ send(sock, &ptr[offset], len, 0);\r
+ offset += len;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((response->status() / 100) != 2)\r
+ {\r
+ DebugLog2("done. response is not OK.");\r
+ done = true;\r
+ }\r
+ else if (request != NULL)\r
+ {\r
+ if (message != NULL)\r
+ {\r
+ InternetTextMessageHeader *header = message->header();\r
+ if (header != NULL)\r
+ {\r
+ String *fieldBody = header->fieldBodyForName(String::stringWithUTF8String("Connection"));\r
+ if (fieldBody != NULL)\r
+ {\r
+ if (strstr(fieldBody->cString(), "close") != NULL)\r
+ {\r
+ DebugLog2("done. request connection is close.");\r
+ done = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("request is null");\r
+ done = true;\r
+ }\r
+\r
+ pool->release();\r
+ if (done)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ DebugLog0("session end. sock = %d", sock);\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _sockets->removeObject(num_sock);\r
+ LeaveCriticalSection(&_cs);\r
+ num_sock->release();\r
+}\r
+\r
+unsigned __stdcall HTTPDaemon_run(void *arg)\r
+{\r
+ ((HTTPDaemon *)arg)->run();\r
+ return 0;\r
+}\r
+\r
+void HTTPDaemon::run()\r
+{\r
+ DebugLog2("%s()\n", __FUNCTION__);\r
+\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ while (_state == ST_READY)\r
+ {\r
+// WSADATA wsaData;\r
+// WSAStartup(MAKEWORD(2,2), &wsaData);\r
+\r
+ SOCKET httpd = INVALID_SOCKET;\r
+\r
+ // ready socket\r
+ httpd = socket(AF_INET, SOCK_STREAM, 0);\r
+ if (httpd == INVALID_SOCKET)\r
+ {\r
+ DebugLog3("error: socket() %d\n", WSAGetLastError());\r
+ break;\r
+ }\r
+\r
+ //\r
+ BOOL yes = 1;\r
+ setsockopt(httpd, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));\r
+\r
+ // bind\r
+ struct sockaddr_in own_addr;\r
+ own_addr.sin_family = AF_INET;\r
+ own_addr.sin_port = htons(_port);\r
+ own_addr.sin_addr.s_addr = htonl(INADDR_ANY);\r
+ if (bind(httpd, (struct sockaddr *)&own_addr, sizeof(own_addr)) != 0)\r
+ {\r
+ DebugLog3("error: bind() %d\n", WSAGetLastError());\r
+ closesocket(httpd);\r
+ break;\r
+ }\r
+\r
+ // listen\r
+ if (listen(httpd, _backlog) != 0)\r
+ {\r
+ DebugLog3("error: listen() %d\n", WSAGetLastError());\r
+ closesocket(httpd);\r
+ break;\r
+ }\r
+\r
+ // state change\r
+ _state = ST_RUN;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ fd_set fdset;\r
+ FD_ZERO(&fdset);\r
+ FD_SET(httpd, &fdset);\r
+ struct timeval timeout = {1, 0};\r
+ \r
+ if (select(0, &fdset, NULL, NULL, &timeout) == SOCKET_ERROR)\r
+ {\r
+ int err = WSAGetLastError();\r
+ if (err != WSAEINTR)\r
+ {\r
+ DebugLog0("error: select() %d\n", err);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (FD_ISSET(httpd, &fdset))\r
+ {\r
+ // accept\r
+ struct sockaddr_in acc_addr;\r
+ int sock_len = sizeof(acc_addr);\r
+ SOCKET newsock;\r
+ if ((newsock = accept(httpd, (struct sockaddr *)&acc_addr, &sock_len)) != INVALID_SOCKET)\r
+ {\r
+ DebugLog0("accepted. newsock = %d", newsock);\r
+ HTTPDaemonSessionArgs *args = new HTTPDaemonSessionArgs();\r
+ args->_daemon = this;\r
+ args->_sock = newsock;\r
+ memcpy(&args->_client, &acc_addr, sizeof(acc_addr));\r
+\r
+ HANDLE h;\r
+ unsigned int uiThreadId;\r
+ h = (HANDLE)_beginthreadex(NULL,\r
+ 0,\r
+ HTTPDaemon_session,\r
+ args,\r
+ 0,\r
+ &uiThreadId);\r
+ if (h == NULL)\r
+ {\r
+ DebugLog0("error: _beginthreades()\n");\r
+ closesocket(newsock);\r
+ delete args;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: accept() %d\n", WSAGetLastError());\r
+ }\r
+ }\r
+\r
+ // state check\r
+ EnterCriticalSection(&_cs);\r
+ done = (_state == ST_DONE);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+\r
+ // socket close\r
+ closesocket(httpd);\r
+\r
+// WSACleanup();\r
+\r
+ // state change\r
+ EnterCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ DebugLog2("HTTPDaemon::run() loop done.");\r
+\r
+ // セッションの終了待ち\r
+ if (_sockets->count() > 0)\r
+ {\r
+ DebugLog2("wait for session close 00");\r
+ // 残存セッションを終了させる為、ソケットを閉じる\r
+ for (uint i = 0; i < _sockets->count(); ++i)\r
+ {\r
+ SOCKET s = (SOCKET)((Number *)_sockets->objectAtIndex(i))->intValue();\r
+ closesocket(s);\r
+ }\r
+ DebugLog2("wait for session close 01");\r
+ // セッションが終了して_socketからオブジェクトを削除するのを待つ\r
+ while (_sockets->count() > 0)\r
+ {\r
+ LeaveCriticalSection(&_cs);\r
+ ::Sleep(200);\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ DebugLog2("wait for session close 02");\r
+ }\r
+\r
+ DebugLog2("HTTPDaemon::run() session close done.");\r
+\r
+ _state = ST_IDLE;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ pool->release();\r
+\r
+ DebugLog2("%s() done.\n", __FUNCTION__);\r
+}\r
+\r
+bool HTTPDaemon::start()\r
+{\r
+ DebugLog2("%s()\n", __FUNCTION__);\r
+ \r
+ bool result = false;\r
+ \r
+ EnterCriticalSection(&_cs);\r
+ \r
+ if (_state == ST_IDLE)\r
+ {\r
+ HANDLE h;\r
+ unsigned int uiThreadId;\r
+ \r
+ h = (HANDLE)_beginthreadex(NULL,\r
+ 0,\r
+ HTTPDaemon_run,\r
+ this,\r
+ 0,\r
+ &uiThreadId);\r
+ if (h != NULL)\r
+ {\r
+ _state = ST_READY;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ bool needSleep = false;\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (_state == ST_IDLE)\r
+ {\r
+ done = true;\r
+ }\r
+ else if (_state == ST_RUN)\r
+ {\r
+ done = true;\r
+ result = true;\r
+ }\r
+ else if (_state == ST_READY)\r
+ {\r
+ needSleep = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ if (needSleep)\r
+ {\r
+ ::Sleep(100); // 100 ms\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ return result;\r
+}\r
+\r
+void HTTPDaemon::stop()\r
+{\r
+ DebugLog2("HTTPDaemon::stop()");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (_state == ST_RUN)\r
+ {\r
+ _state = ST_DONE;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ wait();\r
+\r
+ DebugLog2("HTTPDaemon::stop() done.");\r
+}\r
+\r
+void HTTPDaemon::wait()\r
+{\r
+ DebugLog2("HTTPDaemon::wait()");\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ done = (_state == ST_IDLE);\r
+ LeaveCriticalSection(&_cs);\r
+ if (!done)\r
+ {\r
+ ::Sleep(100);\r
+ }\r
+ }\r
+ DebugLog2("HTTPDaemon::wait() done.");\r
+}\r
+\r
+const char *HTTPDaemon::className()\r
+{\r
+ return "NET::HTTPDaemon";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// HTTPDaemon.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include <windows.h>\r
+#include <process.h>\r
+#include <stdlib.h>\r
+#include <winsock.h>\r
+\r
+#include "Raym/Raym.h"\r
+\r
+#include "net/HTTPRequest.h"\r
+#include "net/HTTPResponse.h"\r
+\r
+\r
+namespace NET\r
+{\r
+\r
+class HTTPDaemonDelegate\r
+{\r
+public:\r
+ virtual HTTPRequest *readRequest(SOCKET sock) = 0;\r
+ virtual HTTPResponse *request(HTTPRequest *request, SOCKET sock, struct sockaddr_in *client) = 0;\r
+\r
+};\r
+\r
+class HTTPDaemon : public Raym::Object\r
+{\r
+private:\r
+ int _port;\r
+ int _backlog;\r
+ HTTPDaemonDelegate * _delegate;\r
+ Raym::String * _rootPath;\r
+ enum _state\r
+ {\r
+ ST_IDLE,\r
+ ST_READY,\r
+ ST_RUN,\r
+ ST_DONE\r
+ } _state;\r
+\r
+protected:\r
+ HTTPDaemon();\r
+ ~HTTPDaemon();\r
+\r
+public:\r
+ static HTTPDaemon *alloc();\r
+ HTTPDaemon *initWithPort(int port, int backlog);\r
+\r
+ void setDelegate(HTTPDaemonDelegate *delegate);\r
+ void setRootPath(Raym::String *path);\r
+ Raym::String *rootPath();\r
+ void run();\r
+ bool start();\r
+ void stop();\r
+ void wait();\r
+\r
+ HTTPResponse *responseWithReason(Raym::String *reason, int status, Raym::String *version);\r
+ HTTPResponse *responseWithPath(Raym::String *path, HTTPRequest *request);\r
+ static HTTPResponse *responseOfUnnecessary();\r
+ static Raym::String *reasonForStatus(int status);\r
+\r
+ // for internal use\r
+ Raym::Array * _sockets;\r
+ void session(SOCKET sock, struct sockaddr_in *client);\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+\r
+class HTTPDaemonSessionArgs\r
+{\r
+public:\r
+ HTTPDaemon * _daemon;\r
+ SOCKET _sock;\r
+ struct sockaddr_in _client;\r
+};\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// HTTPRequest.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include "net/HTTPRequest.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+const char *HTTPRequest::KEY_CGI = "CGI";\r
+const char *HTTPRequest::KEY_PARAMS = "PARAMS";\r
+\r
+HTTPRequest::HTTPRequest()\r
+{\r
+ _method = NULL;\r
+ _uri = NULL;\r
+ _version = NULL;\r
+ _message = NULL;\r
+}\r
+\r
+HTTPRequest::~HTTPRequest()\r
+{\r
+ RELEASE(_method);\r
+ RELEASE(_uri);\r
+ RELEASE(_version);\r
+ RELEASE(_message);\r
+}\r
+\r
+HTTPRequest *HTTPRequest::requestWithSocket(SOCKET sock)\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+\r
+ char buf[16384];\r
+ int offset = 0;\r
+ while (offset < sizeof(buf) - 1)\r
+ {\r
+ int len = recv(sock, &buf[offset], 1, 0);\r
+ if (len == 0)\r
+ {\r
+ break;\r
+ }\r
+ if (offset > 0)\r
+ {\r
+ if ((buf[offset - 1] == '\r') && (buf[offset] == '\n'))\r
+ {\r
+ ++offset;\r
+ break;\r
+ }\r
+ }\r
+ ++offset;\r
+ }\r
+ buf[offset] = '\0';\r
+\r
+ DebugLog2("%s 02", __FUNCTION__);\r
+\r
+ HTTPRequest *result = NULL;\r
+\r
+ String *method = NULL;\r
+ String *uri = NULL;\r
+ String *version = NULL;\r
+ if (strchr(buf, ' ') != NULL)\r
+ {\r
+ char *p = strchr(buf, ' ');\r
+ *p++ = '\0';\r
+ if ((buf[strlen(buf) - 2] == '\r') && (buf[strlen(buf) - 1] == '\n'))\r
+ {\r
+ buf[strlen(buf) - 2] = '\0';\r
+ }\r
+ method = String::alloc()->initWithUTF8String(&buf[0]);\r
+ while (*p == ' ')\r
+ {\r
+ ++p;\r
+ }\r
+ if (strchr(p, ' ') != NULL)\r
+ {\r
+ char *p2 = strchr(p, ' ');\r
+ *p2++ = '\0';\r
+ if ((p[strlen(p) - 2] == '\r') && (p[strlen(p) - 1] == '\n'))\r
+ {\r
+ p[strlen(p) - 2] = '\0';\r
+ }\r
+ uri = String::alloc()->initWithUTF8String(p);\r
+ while (*p2 == ' ')\r
+ {\r
+ ++p2;\r
+ }\r
+ if (strchr(p2, ' ') == NULL)\r
+ {\r
+ if ((p2[strlen(p2) - 2] == '\r') && (p2[strlen(p2) - 1] == '\n'))\r
+ {\r
+ p2[strlen(p2) - 2] = '\0';\r
+ }\r
+ version = String::alloc()->initWithUTF8String(p2);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (version != NULL)\r
+ {\r
+ if (version->isEqualToString(String::stringWithUTF8String("HTTP/1.0")) || version->isEqualToString(String::stringWithUTF8String("HTTP/1.1")))\r
+ {\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->initWithSocket(sock);\r
+ if (header != NULL)\r
+ {\r
+ InternetTextMessageBody *body = NULL;\r
+ /*\r
+ if (header->fieldBodyForName("Transfer-Encoding") != NULL)\r
+ {\r
+ DebugLog3("has Transfer-Encoding\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Length") != NULL)\r
+ {\r
+ DebugLog3("has Content-Length\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Type") != NULL)\r
+ {\r
+ DebugLog3("has Content-Type\n");\r
+ abort();\r
+ }\r
+ */\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+\r
+ result = new HTTPRequest();\r
+ result->setMethod(method);\r
+ result->setURI(uri);\r
+ result->setVersion(version);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+\r
+ RELEASE(message);\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: InternetTextMessageHeader::headerWithSocket()\n");\r
+ }\r
+ }\r
+ }\r
+\r
+ RELEASE(method);\r
+ RELEASE(uri);\r
+ RELEASE(version);\r
+\r
+ return result;\r
+}\r
+\r
+void HTTPRequest::setMethod(String *method)\r
+{\r
+ SET_METHOD(_method, method);\r
+}\r
+\r
+String *HTTPRequest::method()\r
+{\r
+ return _method;\r
+}\r
+\r
+void HTTPRequest::setURI(String *uri)\r
+{\r
+ SET_METHOD(_uri, uri);\r
+}\r
+\r
+String *HTTPRequest::URI()\r
+{\r
+ return _uri;\r
+}\r
+\r
+void HTTPRequest::setVersion(String *version)\r
+{\r
+ SET_METHOD(_version, version);\r
+}\r
+\r
+String *HTTPRequest::version()\r
+{\r
+ return _version;\r
+}\r
+\r
+void HTTPRequest::setMessage(InternetTextMessage *message)\r
+{\r
+ SET_METHOD(_message, message);\r
+}\r
+\r
+InternetTextMessage *HTTPRequest::message()\r
+{\r
+ return _message;\r
+}\r
+\r
+Dictionary *HTTPRequest::parseAsCGI()\r
+{\r
+ DebugLog2("HTTPRequest::parseAsCGI()");\r
+\r
+ Dictionary *result = NULL;\r
+ if (_uri != NULL)\r
+ {\r
+ DebugLog3("_uri != NULL");\r
+ char *tmpstr = _strdup(_uri->cString());\r
+ if (tmpstr != NULL)\r
+ {\r
+ DebugLog3("tmpstr != NULL");\r
+ char *p1 = strchr(tmpstr, '?');\r
+ if (p1 != NULL)\r
+ {\r
+ DebugLog3("p1 != NULL");\r
+ *p1 = '\0';\r
+ DebugLog2("cgi: %s", tmpstr);\r
+ result = Dictionary::dictionaryWithCapacity(0);\r
+ result->setObject(String::stringWithUTF8String(tmpstr), KEY_CGI);\r
+\r
+ Array *params = Array::arrayWithCapacity(0);\r
+ result->setObject(params, KEY_PARAMS);\r
+\r
+ ++p1;\r
+ while (true)\r
+ {\r
+ char *p2 = strchr(p1, '&');\r
+ if (p2 != NULL)\r
+ {\r
+ *p2 = '\0';\r
+ }\r
+ char *p3 = strchr(p1, '=');\r
+ if (p3 != NULL)\r
+ {\r
+ *p3 = '\0';\r
+ String *para_name = String::stringWithUTF8String(p1);\r
+ ++p3;\r
+ String *para_val = String::stringWithUTF8String(p3);\r
+ DebugLog3("para_name: %s, para_val: %s", p1, p3);\r
+ Dictionary *para = Dictionary::dictionaryWithCapacity(0);\r
+ para->setObject(para_val, para_name);\r
+ params->addObject(para);\r
+ }\r
+\r
+ // 終端判定\r
+ if (p2 == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ // 次パラメータに設定\r
+ p1 = p2 + 1;\r
+ }\r
+ }\r
+\r
+ free(tmpstr);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+const char *HTTPRequest::className()\r
+{\r
+ return "HTTPRequest";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// HTTPRequest.h\r
+//\r
+\r
+#ifndef __NET_HTTPREQUEST_H__\r
+#define __NET_HTTPREQUEST_H__\r
+\r
+#include <Raym/Raym.h>\r
+\r
+#include "net/InternetTextMessage.h"\r
+\r
+namespace NET\r
+{\r
+\r
+class HTTPRequest : public Raym::Object\r
+{\r
+private:\r
+ Raym::String * _method;\r
+ Raym::String * _uri;\r
+ Raym::String * _version;\r
+ InternetTextMessage * _message;\r
+\r
+protected:\r
+ HTTPRequest();\r
+ ~HTTPRequest();\r
+\r
+public:\r
+ static HTTPRequest *requestWithSocket(SOCKET sock);\r
+\r
+ void setMethod(Raym::String *method);\r
+ Raym::String *method();\r
+ void setURI(Raym::String *uri);\r
+ Raym::String *URI();\r
+ void setVersion(Raym::String *version);\r
+ Raym::String *version();\r
+ void setMessage(InternetTextMessage *message);\r
+ InternetTextMessage *message();\r
+\r
+\r
+ // parse\r
+ static const char *KEY_CGI;\r
+ static const char *KEY_PARAMS;\r
+ Raym::Dictionary *parseAsCGI();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
+\r
+#endif // __NET_HTTPREQUEST_H__\r
--- /dev/null
+//\r
+// HTTPResponse.cpp\r
+//\r
+\r
+#include "net/HTTPResponse.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+HTTPResponse::HTTPResponse()\r
+{\r
+ _version = NULL;\r
+ _status = 0;\r
+ _reason = NULL;\r
+ _message = NULL;\r
+}\r
+\r
+HTTPResponse::~HTTPResponse()\r
+{\r
+ RELEASE(_version);\r
+ RELEASE(_reason);\r
+ RELEASE(_message);\r
+}\r
+\r
+HTTPResponse *HTTPResponse::alloc()\r
+{\r
+#if 0\r
+ HTTPResponse *result;\r
+ result = new HTTPResponse();\r
+ result->init();\r
+ result->autorelease();\r
+ return result;\r
+#else\r
+ return new HTTPResponse();\r
+#endif\r
+}\r
+\r
+HTTPResponse *HTTPResponse::init()\r
+{\r
+ return this;\r
+}\r
+\r
+void HTTPResponse::setVersion(String *version)\r
+{\r
+ SET_METHOD(_version, version);\r
+}\r
+\r
+String *HTTPResponse::version()\r
+{\r
+ return _version;\r
+}\r
+\r
+void HTTPResponse::setStatus(int status)\r
+{\r
+ _status = status;\r
+}\r
+\r
+int HTTPResponse::status()\r
+{\r
+ return _status;\r
+}\r
+\r
+void HTTPResponse::setReason(String *reason)\r
+{\r
+ SET_METHOD(_reason, reason);\r
+}\r
+\r
+String *HTTPResponse::reason()\r
+{\r
+ return _reason;\r
+}\r
+\r
+void HTTPResponse::setMessage(InternetTextMessage *message)\r
+{\r
+ SET_METHOD(_message, message);\r
+}\r
+\r
+InternetTextMessage *HTTPResponse::message()\r
+{\r
+ return _message;\r
+}\r
+\r
+const char *HTTPResponse::className()\r
+{\r
+ return "HTTPResponse";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// HTTPResponse.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Raym.h>\r
+\r
+#include "net/InternetTextMessage.h"\r
+\r
+namespace NET\r
+{\r
+\r
+enum HTTP_STATUS\r
+{\r
+ // Informational 1xx\r
+ HTTP_STATUS_CONTINUE = 100,\r
+ HTTP_STATUS_SWITCHING_PROTOCOLS = 101,\r
+ // Successful 2xx\r
+ HTTP_STATUS_OK = 200,\r
+ HTTP_STATUS_CREATED = 201,\r
+ HTTP_STATUS_ACCEPTED = 202,\r
+ HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203,\r
+ HTTP_STATUS_NO_CONTENT = 204,\r
+ HTTP_STATUS_RESET_CONTENT = 205,\r
+ HTTP_STATUS_PARTIAL_CONTENT = 206,\r
+ // Redirection 3xx\r
+ HTTP_STATUS_MULTIPLE_CHOICES = 300,\r
+ HTTP_STATUS_MOVED_PERMANENTLY = 301,\r
+ HTTP_STATUS_FOUND = 302,\r
+ HTTP_STATUS_SEE_OTHER = 303,\r
+ HTTP_STATUS_NOT_MODIFIED = 304,\r
+ HTTP_STATUS_USE_PROXY = 305,\r
+ HTTP_STATUS_UNUSED = 306,\r
+ HTTP_STATUS_TEMPORARY_REDIRECT = 307,\r
+ // Client Error 4xx\r
+ HTTP_STATUS_BAD_REQUEST = 400,\r
+ HTTP_STATUS_UNAUTHORIZED = 401,\r
+ HTTP_STATUS_PAYMENT_REQUIRED = 402,\r
+ HTTP_STATUS_FORBIDDEN = 403,\r
+ HTTP_STATUS_NOT_FOUND = 404,\r
+ HTTP_STATUS_METHOD_NOT_ALLOWED = 405,\r
+ HTTP_STATUS_NOT_ACCEPTABLE = 406,\r
+ HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407,\r
+ HTTP_STATUS_REQUEST_TIMEOUT = 408,\r
+ HTTP_STATUS_CONFLICT = 409,\r
+ HTTP_STATUS_GONE = 410,\r
+ HTTP_STATUS_LENGTH_REQUIRED = 411,\r
+ HTTP_STATUS_PRECONDITION_FAILED = 412,\r
+ HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413,\r
+ HTTP_STATUS_REQUEST_URI_TOO_LONG = 414,\r
+ HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,\r
+ HTTP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE = 416,\r
+ HTTP_STATUS_EXPECTATION_FAILED = 417,\r
+ // Server Error 5xx\r
+ HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,\r
+ HTTP_STATUS_NOT_IMPLEMENTED = 501,\r
+ HTTP_STATUS_BAD_GATEWAY = 502,\r
+ HTTP_STATUS_SERVICE_UNAVAILABLE = 503,\r
+ HTTP_STATUS_GATEWAY_TIMEOUT = 504,\r
+ HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED = 505\r
+};\r
+\r
+class HTTPResponse : public Raym::Object\r
+{\r
+private:\r
+ Raym::String * _version;\r
+ int _status;\r
+ Raym::String * _reason;\r
+ InternetTextMessage * _message;\r
+\r
+protected:\r
+ HTTPResponse();\r
+ ~HTTPResponse();\r
+\r
+public:\r
+ static HTTPResponse *alloc();\r
+ HTTPResponse *init();\r
+\r
+ void setVersion(Raym::String *version);\r
+ Raym::String *version();\r
+ void setStatus(int status);\r
+ int status();\r
+ void setReason(Raym::String *reason);\r
+ Raym::String *reason();\r
+ void setMessage(InternetTextMessage *message);\r
+ InternetTextMessage *message();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
+\r
--- /dev/null
+//\r
+// InternetTextMessage.cpp\r
+//\r
+\r
+#include "net/InternetTextMessage.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+InternetTextMessage::InternetTextMessage()\r
+{\r
+ _header = NULL;\r
+ _body = NULL;\r
+}\r
+\r
+InternetTextMessage::~InternetTextMessage()\r
+{\r
+ if (_body != NULL)\r
+ {\r
+ _body->release();\r
+ _body = NULL;\r
+ }\r
+ if (_header != NULL)\r
+ {\r
+ _header->release();\r
+ _header = NULL;\r
+ }\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::alloc()\r
+{\r
+ return new InternetTextMessage();\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::initWithContentsOfFile(const char *path)\r
+{\r
+ /*\r
+ NSFileManager *fm = [NSFileManager defaultManager];\r
+ return [self initWithData:[fm contentsAtPath:path]];\r
+ */\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::initWithData(Data *data)\r
+{\r
+ /*\r
+ if ((self = [super init]) != nil)\r
+ {\r
+ _header = nil;\r
+ _body = nil;\r
+\r
+ char *tmp = "\r\n\r\n";\r
+ Data *crlfcrlf = [Data dataWithBytes:tmp length:4];\r
+ NSRange r = {0, [data length]};\r
+ r = [data rangeOfData:crlfcrlf options:0 range:r];\r
+ if (r.location != NSNotFound)\r
+ {\r
+ NSRange rh = {0, r.location + 4};\r
+ Data *dh = [data subdataWithRange:rh];\r
+ _header = [[InternetTextMessageHeader alloc] initWithData:dh];\r
+ NSRange rb = {r.location + 4, ([data length] - (r.location + 4))};\r
+ Data *db = [data subdataWithRange:rb];\r
+ _body = [[InternetTextMessageBody alloc] initWithData:db];\r
+ }\r
+ else\r
+ {\r
+ [self release];\r
+ self = nil;\r
+ }\r
+ }\r
+ */\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::initWithHeaderAndBody(InternetTextMessageHeader *header, InternetTextMessageBody *body)\r
+{\r
+ if (header != NULL)\r
+ {\r
+ _header = header->retain();\r
+ if (body != NULL)\r
+ {\r
+ _body = body->retain();\r
+ }\r
+ return this;\r
+ }\r
+\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::retain()\r
+{\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+InternetTextMessage *InternetTextMessage::autorelease()\r
+{\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessage::header()\r
+{\r
+ return _header;\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessage::body()\r
+{\r
+ return _body;\r
+}\r
+\r
+Data *InternetTextMessage::data()\r
+{\r
+ /*\r
+ NSMutableData *result = [NSMutableData dataWithData:[_header data]];\r
+ if ([_body data])\r
+ {\r
+ [result appendData:[_body data]];\r
+ }\r
+ else\r
+ {\r
+ [result appendData:[[_body body] dataUsingEncoding:[_header encoding]]];\r
+ }\r
+ */\r
+ return NULL;\r
+}\r
+\r
+const char *InternetTextMessage::className()\r
+{\r
+ return "NET::InternetTextMessage";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// InternetTextMessage.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include "net/InternetTextMessageHeader.h"\r
+#include "net/InternetTextMessageBody.h"\r
+\r
+namespace NET\r
+{\r
+\r
+class InternetTextMessage : public Raym::Object\r
+{\r
+private:\r
+ InternetTextMessageHeader * _header;\r
+ InternetTextMessageBody * _body;\r
+\r
+protected:\r
+ InternetTextMessage();\r
+ ~InternetTextMessage();\r
+\r
+public:\r
+ static InternetTextMessage *alloc();\r
+ InternetTextMessage *initWithContentsOfFile(const char *path);\r
+ InternetTextMessage *initWithData(Raym::Data *data);\r
+ InternetTextMessage *initWithHeaderAndBody(InternetTextMessageHeader *header, InternetTextMessageBody *body);\r
+ InternetTextMessage *retain();\r
+ InternetTextMessage *autorelease();\r
+\r
+ InternetTextMessageHeader *header();\r
+ InternetTextMessageBody *body();\r
+\r
+ Raym::Data *data();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
+\r
--- /dev/null
+//\r
+// InternetTextMessageBody.cpp\r
+//\r
+\r
+#include <stdlib.h>\r
+\r
+#include "net/InternetTextMessageBody.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+InternetTextMessageBody::InternetTextMessageBody()\r
+{\r
+ _body = NULL;\r
+ _data = NULL;\r
+}\r
+\r
+InternetTextMessageBody::~InternetTextMessageBody()\r
+{\r
+ RELEASE(_body);\r
+ RELEASE(_data);\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessageBody::alloc()\r
+{\r
+ return new InternetTextMessageBody();\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessageBody::initWithString(String *string)\r
+{\r
+ if (string != NULL)\r
+ {\r
+ _body = string->retain();\r
+ return this;\r
+ }\r
+\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessageBody::initWithData(Data *data)\r
+{\r
+\r
+ if (data != NULL)\r
+ {\r
+ _data = data->retain();\r
+ return this;\r
+ }\r
+\r
+ release();\r
+ return NULL;\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessageBody::retain()\r
+{\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+InternetTextMessageBody *InternetTextMessageBody::autorelease()\r
+{\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+String *InternetTextMessageBody::body()\r
+{\r
+ return _body;\r
+}\r
+\r
+Data *InternetTextMessageBody::data()\r
+{\r
+ return _data;\r
+}\r
+\r
+const char *InternetTextMessageBody::className()\r
+{\r
+ return "NET::InternetTextMessageBody";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// InternetTextMessageBody.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include <Raym/Raym.h>\r
+\r
+namespace NET\r
+{\r
+\r
+class InternetTextMessageBody : public Raym::Object\r
+{\r
+private:\r
+ Raym::String * _body;\r
+ Raym::Data * _data;\r
+\r
+protected:\r
+ InternetTextMessageBody();\r
+ ~InternetTextMessageBody();\r
+\r
+public:\r
+ static InternetTextMessageBody *alloc();\r
+ InternetTextMessageBody *initWithString(Raym::String *string);\r
+ InternetTextMessageBody *initWithData(Raym::Data *data);\r
+ InternetTextMessageBody *retain();\r
+ InternetTextMessageBody *autorelease();\r
+\r
+ Raym::String *body();\r
+ Raym::Data *data();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
+\r
--- /dev/null
+//\r
+// InternetTextMessageHeader.h\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include "net/InternetTextMessageHeader.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+InternetTextMessageHeader::InternetTextMessageHeader()\r
+{\r
+ _encoding = ASCIIStringEncoding;\r
+ _fields = NULL;\r
+ _data = NULL;\r
+}\r
+\r
+InternetTextMessageHeader::~InternetTextMessageHeader()\r
+{\r
+ RELEASE(_fields);\r
+ RELEASE(_data);\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::alloc()\r
+{\r
+ return new InternetTextMessageHeader();\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::init()\r
+{\r
+ RELEASE(_fields);\r
+ RELEASE(_data);\r
+ _fields = Dictionary::alloc()->initWithCapacity(0);\r
+ return this;\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::initWithData(Data *data)\r
+{\r
+ DebugLog2("%s()\n", __FUNCTION__);\r
+\r
+ init();\r
+\r
+ if (data != NULL)\r
+ {\r
+ _data = data->retain();\r
+\r
+ char field[512];\r
+ const char *buffer = (const char *)data->bytes();\r
+\r
+ int index = 0;\r
+ uint offset = 0;\r
+ while (offset < data->length())\r
+ {\r
+ field[index++] = buffer[offset++];\r
+ if ((field[index - 2] == '\r') && (field[index - 1] == '\n'))\r
+ {\r
+ field[index - 2] = '\0';\r
+ char *value = strchr(field, ':');\r
+ if (value != NULL)\r
+ {\r
+ *value++ = '\0';\r
+ while (*value == ' ')\r
+ {\r
+ ++value;\r
+ }\r
+\r
+ DebugLog3("%s: %s", field, value);\r
+ String *body = String::stringWithUTF8String(value);\r
+ String *name = String::stringWithUTF8String(field);\r
+ setFieldBodyWithName(body, name);\r
+ }\r
+\r
+ index = 0;\r
+ }\r
+ }\r
+ }\r
+ return this;\r
+/*\r
+ char *tmp = (char *)malloc([data length] + 1);\r
+ [data getBytes:tmp length:[data length]];\r
+ tmp[[data length]] = '\0';\r
+ String *headStr = [String stringWithCString:tmp encoding:_encoding];\r
+ if ([headStr rangeOfString:@"content-type" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ if ([headStr rangeOfString:@"charset" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ if ([headStr rangeOfString:@"iso-2022-jp" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = ISO2022JPStringEncoding;\r
+ }\r
+ else if ([headStr rangeOfString:@"shift_jis" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = ShiftJISStringEncoding;\r
+ }\r
+ else if ([headStr rangeOfString:@"euc-jp" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = JapaneseEUCStringEncoding;\r
+ }\r
+ else if ([headStr rangeOfString:@"utf-8" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = UTF8StringEncoding;\r
+ }\r
+ }\r
+ }\r
+*/\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::initWithArray(Array *array)\r
+{\r
+ /*\r
+ if ((self = [super init]) != nil)\r
+ {\r
+ _dictionary = [[MutableDictionary alloc] initWithCapacity:0];\r
+ _encoding = ASCIIStringEncoding;\r
+ for (int i = 0; i < [array count]; ++i)\r
+ {\r
+ String *line = [array objectAtIndex:i];\r
+ Range r = [line rangeOfString:@":"];\r
+ if (r.location != NotFound)\r
+ {\r
+ String *fieldName = [line substringToIndex:r.location];\r
+ String *fieldBody = [[line substringFromIndex:(r.location + 1)] stringByTrimmingCharactersInSet:[CharacterSet whitespaceAndNewlineCharacterSet]];\r
+ [_dictionary setObject:fieldBody forKey:fieldName];\r
+ }\r
+ }\r
+ }\r
+ return self;\r
+ */\r
+ return this;\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::initWithSocket(SOCKET sock)\r
+{\r
+ DebugLog2("%s()\n", __FUNCTION__);\r
+\r
+ char *tmp = "\r\n\r\n";\r
+\r
+ int length = 0;\r
+ char buf[16384];\r
+\r
+ while (length < sizeof(buf))\r
+ {\r
+ char c;\r
+ if (recv(sock, &c, 1, 0) == 1)\r
+ {\r
+ buf[length++] = c;\r
+ if (length >= 4)\r
+ {\r
+ if (strncmp(&buf[length - 4], tmp, 4) == 0)\r
+ {\r
+ Data *data = Data::alloc()->initWithBytesAndLength(buf, length);\r
+ initWithData(data);\r
+ data->release();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // EOF or error\r
+ break;\r
+ }\r
+ }\r
+ return this;\r
+}\r
+\r
+/*\r
+- (StringEncoding)encoding\r
+{\r
+ return _encoding;\r
+}\r
+*/\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::retain()\r
+{\r
+ Object::retain();\r
+ return this;\r
+}\r
+\r
+InternetTextMessageHeader *InternetTextMessageHeader::autorelease()\r
+{\r
+ Object::autorelease();\r
+ return this;\r
+}\r
+\r
+Array *InternetTextMessageHeader::fieldNames()\r
+{\r
+ return _fields->allKeys();\r
+}\r
+\r
+String *InternetTextMessageHeader::fieldBodyForName(String *name)\r
+{\r
+ return (String *)_fields->objectForKey(name);\r
+}\r
+\r
+String *InternetTextMessageHeader::fieldBodyForName(const char *name)\r
+{\r
+ return (String *)_fields->objectForKey(name);\r
+}\r
+\r
+void InternetTextMessageHeader::setFieldBodyWithName(String *body, String *name)\r
+{\r
+ _fields->setObject(body, name);\r
+ /*\r
+ if ([[name lowercaseString] isEqualToString:@"content-type"])\r
+ {\r
+ if ([body rangeOfString:@"charset" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ if ([body rangeOfString:@"iso-2022-jp" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = ISO2022JPStringEncoding;\r
+ }\r
+ else if ([body rangeOfString:@"shift_jis" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = ShiftJISStringEncoding;\r
+ }\r
+ else if ([body rangeOfString:@"euc-jp" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = JapaneseEUCStringEncoding;\r
+ }\r
+ else if ([body rangeOfString:@"utf-8" options:CaseInsensitiveSearch].location != NotFound)\r
+ {\r
+ _encoding = UTF8StringEncoding;\r
+ }\r
+ }\r
+ }\r
+ */\r
+}\r
+\r
+void InternetTextMessageHeader::setFieldBodyWithName(const char *body, String *name)\r
+{\r
+ setFieldBodyWithName(String::stringWithUTF8String(body), name);\r
+}\r
+\r
+void InternetTextMessageHeader::setFieldBodyWithName(String *body, const char *name)\r
+{\r
+ setFieldBodyWithName(body, String::stringWithUTF8String(name));\r
+}\r
+\r
+void InternetTextMessageHeader::setFieldBodyWithName(const char *body, const char *name)\r
+{\r
+ setFieldBodyWithName(String::stringWithUTF8String(body), String::stringWithUTF8String(name));\r
+}\r
+\r
+Data *InternetTextMessageHeader::data()\r
+{\r
+ /*\r
+ MutableString *headerString = [MutableString stringWithCapacity:0];\r
+ Array *fieldNames = [_dictionary allKeys];\r
+\r
+ // Content-type\r
+ for (int i = 0; i < [fieldNames count]; ++i)\r
+ {\r
+ String *fieldName = [fieldNames objectAtIndex:i];\r
+ if ([[fieldName lowercaseString] isEqualToString:@"content-type"])\r
+ {\r
+ [headerString appendFormat:@"Content-type: %@\r\n", [_dictionary objectForKey:fieldName]];\r
+ break;\r
+ }\r
+ }\r
+\r
+ // other\r
+ for (int i = 0; i < [fieldNames count]; ++i)\r
+ {\r
+ String *fieldName = [fieldNames objectAtIndex:i];\r
+ String *lowercase = [fieldName lowercaseString];\r
+ if (![lowercase isEqualToString:@"content-type"])\r
+ {\r
+ [headerString appendFormat:@"%@: %@\r\n", fieldName, [_dictionary objectForKey:fieldName]];\r
+ }\r
+ }\r
+\r
+ [headerString appendString:@"\r\n\r\n"];\r
+\r
+ return [Data dataWithBytes:[headerString cStringUsingEncoding:_encoding] length:[headerString lengthOfBytesUsingEncoding:_encoding]];\r
+ */\r
+ return NULL;\r
+}\r
+\r
+const char *InternetTextMessageHeader::className()\r
+{\r
+ return "NET::InternetTextMessageHeader";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// InternetTextMessageHeader.h\r
+//\r
+\r
+#pragma once\r
+\r
+#include <stdio.h>\r
+\r
+#include <Raym/Raym.h>\r
+\r
+namespace NET\r
+{\r
+\r
+class InternetTextMessageHeader : public Raym::Object\r
+{\r
+private:\r
+ Raym::StringEncoding _encoding;\r
+ Raym::Dictionary * _fields;\r
+ Raym::Data * _data;\r
+\r
+protected:\r
+ InternetTextMessageHeader();\r
+ ~InternetTextMessageHeader();\r
+\r
+public:\r
+ static InternetTextMessageHeader *alloc();\r
+ InternetTextMessageHeader *init();\r
+ InternetTextMessageHeader *initWithData(Raym::Data *data);\r
+ InternetTextMessageHeader *initWithArray(Raym::Array *array);\r
+ InternetTextMessageHeader *initWithSocket(SOCKET sock);\r
+ InternetTextMessageHeader *retain();\r
+ InternetTextMessageHeader *autorelease();\r
+\r
+ Raym::StringEncoding encoding();\r
+\r
+ Raym::Array *fieldNames();\r
+ Raym::String *fieldBodyForName(Raym::String *name);\r
+ Raym::String *fieldBodyForName(const char *name);\r
+\r
+ void setFieldBodyWithName(Raym::String *body, Raym::String *name);\r
+ void setFieldBodyWithName(const char *body, Raym::String *name);\r
+ void setFieldBodyWithName(Raym::String *body, const char *name);\r
+ void setFieldBodyWithName(const char *body, const char *name);\r
+\r
+ Raym::Data *data();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
+\r
--- /dev/null
+/**\r
+ * @file RTSPRequest.cpp\r
+ *\r
+ */\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include "net/RTSPRequest.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace NET\r
+{\r
+\r
+RTSPRequest::RTSPRequest()\r
+{\r
+}\r
+\r
+RTSPRequest::~RTSPRequest()\r
+{\r
+}\r
+\r
+RTSPRequest *RTSPRequest::requestWithSocket(SOCKET sock)\r
+{\r
+ DebugLog2("%s", __FUNCTION__);\r
+\r
+ char buf[16384];\r
+ int offset = 0;\r
+ while (offset < sizeof(buf) - 1)\r
+ {\r
+ int len = recv(sock, &buf[offset], 1, 0);\r
+ if (len == 0)\r
+ {\r
+ break;\r
+ }\r
+ if (offset > 0)\r
+ {\r
+ if ((buf[offset - 1] == '\r') && (buf[offset] == '\n'))\r
+ {\r
+ ++offset;\r
+ break;\r
+ }\r
+ }\r
+ ++offset;\r
+ }\r
+ buf[offset] = '\0';\r
+\r
+ DebugLog2("request line: %s", buf);\r
+\r
+ RTSPRequest *result = NULL;\r
+\r
+ String *method = NULL;\r
+ String *uri = NULL;\r
+ String *version = NULL;\r
+ if (strchr(buf, ' ') != NULL)\r
+ {\r
+ char *p = strchr(buf, ' ');\r
+ *p++ = '\0';\r
+ if ((buf[strlen(buf) - 2] == '\r') && (buf[strlen(buf) - 1] == '\n'))\r
+ {\r
+ buf[strlen(buf) - 2] = '\0';\r
+ }\r
+ method = String::alloc()->initWithUTF8String(&buf[0]);\r
+ while (*p == ' ')\r
+ {\r
+ ++p;\r
+ }\r
+ if (strchr(p, ' ') != NULL)\r
+ {\r
+ char *p2 = strchr(p, ' ');\r
+ *p2++ = '\0';\r
+ if ((p[strlen(p) - 2] == '\r') && (p[strlen(p) - 1] == '\n'))\r
+ {\r
+ p[strlen(p) - 2] = '\0';\r
+ }\r
+ uri = String::alloc()->initWithUTF8String(p);\r
+ while (*p2 == ' ')\r
+ {\r
+ ++p2;\r
+ }\r
+ if (strchr(p2, ' ') == NULL)\r
+ {\r
+ if ((p2[strlen(p2) - 2] == '\r') && (p2[strlen(p2) - 1] == '\n'))\r
+ {\r
+ p2[strlen(p2) - 2] = '\0';\r
+ }\r
+ version = String::alloc()->initWithUTF8String(p2);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (method != NULL)\r
+ {\r
+ DebugLog3("method: %s", method->cString());\r
+ }\r
+ if (uri != NULL)\r
+ {\r
+ DebugLog3("uri: %s", uri->cString());\r
+ }\r
+ if (version != NULL)\r
+ {\r
+ DebugLog3("version: %s", version->cString());\r
+ }\r
+\r
+ if (version != NULL)\r
+ {\r
+ if (version->isMatch("^(HTTP/1.[01]|RTSP/1.0)$"))\r
+ {\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->initWithSocket(sock);\r
+ if (header != NULL)\r
+ {\r
+ InternetTextMessageBody *body = NULL;\r
+ /*\r
+ if (header->fieldBodyForName("Transfer-Encoding") != NULL)\r
+ {\r
+ DebugLog3("has Transfer-Encoding\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Length") != NULL)\r
+ {\r
+ DebugLog3("has Content-Length\n");\r
+ abort();\r
+ }\r
+ else if (header->fieldBodyForName("Content-Type") != NULL)\r
+ {\r
+ DebugLog3("has Content-Type\n");\r
+ abort();\r
+ }\r
+ */\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+\r
+ result = new RTSPRequest();\r
+ result->setMethod(method);\r
+ result->setURI(uri);\r
+ result->setVersion(version);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+\r
+ RELEASE(message);\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: InternetTextMessageHeader::headerWithSocket()\n");\r
+ }\r
+ }\r
+ }\r
+\r
+ RELEASE(method);\r
+ RELEASE(uri);\r
+ RELEASE(version);\r
+\r
+ return result;\r
+}\r
+\r
+const char *RTSPRequest::className()\r
+{\r
+ return "RTSPRequest";\r
+}\r
+\r
+} // NET\r
--- /dev/null
+/**\r
+ * @file RTSPRequest.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include <Raym/Raym.h>\r
+\r
+#include "net/HTTPRequest.h"\r
+#include "net/InternetTextMessage.h"\r
+\r
+namespace NET\r
+{\r
+\r
+class RTSPRequest : public HTTPRequest\r
+{\r
+private:\r
+\r
+protected:\r
+ RTSPRequest();\r
+ ~RTSPRequest();\r
+\r
+public:\r
+ static RTSPRequest *requestWithSocket(SOCKET sock);\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // NET\r
--- /dev/null
+//\r
+// PT1Core.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+#include "ry0/device/PT1/PT1Core.h"\r
+#include "ry0/device/PT1/PT1Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT1\r
+{\r
+\r
+unsigned __stdcall PT1Core_transfer(void *arg)\r
+{\r
+ ((PT1Core *)arg)->transfer();\r
+ return 0;\r
+}\r
+\r
+PT1Core::PT1Core(EARTH::PT::Bus *bus, const EARTH::PT::Bus::DeviceInfo *deviceInfo, Tuner *tuners[MAX_TUNERS], HMODULE multi2_dll)\r
+{\r
+ DebugLog2("PT1Core::PT1Core()");\r
+\r
+ InitializeCriticalSection(&_cs);\r
+\r
+ // initialize: variables\r
+ _device = NULL;\r
+ for (EARTH::uint i = 0; i < 4; ++i)\r
+ {\r
+ _tuners[i] = NULL;\r
+ _locked[i] = false;\r
+ }\r
+ _name[0] = '\0';\r
+ _transfer = ST_IDLE;\r
+\r
+ // initialize: PT1\r
+ EARTH::status status;\r
+ status = bus->NewDevice(deviceInfo, &_device, NULL);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Bus::NewDevice() (0x%08x)\n", status);\r
+ throw EXCEPTION_NEW_DEVICE;\r
+ }\r
+\r
+ status = _device->Open();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Open() (0x%08x)\n", status);\r
+ int except = EXCEPTION_OPEN;\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ status = _device->SetTunerPowerReset(EARTH::PT::Device::TUNER_POWER_ON_RESET_ENABLE);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTunerPowerReset(TUNER_POWER_ON_RESET_ENABLE) (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_TUNER_POWER_RESET;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ /*\r
+ EARTH::OS::Thread::Sleep((20)*1000*1000); // 20 ms\r
+ */\r
+ ::Sleep(20);\r
+ \r
+ status = _device->SetTunerPowerReset(EARTH::PT::Device::TUNER_POWER_ON_RESET_DISABLE);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTunerPowerReset(TUNER_POWER_ON_RESET_DISABLE) (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_TUNER_POWER_RESET;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ /*\r
+ EARTH::OS::Thread::Sleep((1)*1000*1000); // 1 ms\r
+ */\r
+ ::Sleep(1);\r
+\r
+ for (EARTH::uint i = 0; i < 2; ++i)\r
+ {\r
+ status = _device->InitTuner(i);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::InitTuner() (0x%08x)\n", status);\r
+ int except = EXCEPTION_INIT_TUNER;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+ }\r
+\r
+ for (EARTH::uint i = 0; i < 2; ++i)\r
+ {\r
+ for (EARTH::uint j = 0; j < 2; ++j)\r
+ {\r
+ status = _device->SetTunerSleep(i, static_cast<EARTH::PT::Device::ISDB>(j), false);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTunerSleep() (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_TUNER_SLEEP;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+ }\r
+ }\r
+\r
+ for (EARTH::uint i = 0; i < 2; ++i)\r
+ {\r
+ for (EARTH::uint j = 0; j < 2; ++j)\r
+ {\r
+ status = _device->SetStreamEnable(i, static_cast<EARTH::PT::Device::ISDB>(j), true);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetStreamEnable() (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_STREAM_ENABLE;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+ }\r
+ }\r
+ \r
+ for (EARTH::uint i = 0; i < 2; ++i)\r
+ {\r
+ for (EARTH::uint j = 0; j < 2; ++j)\r
+ {\r
+ status = _device->SetStreamGray(i, static_cast<EARTH::PT::Device::ISDB>(j), 4 + i*2 + j);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetStreamGray() (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_STREAM_GRAY;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+ }\r
+ }\r
+\r
+ for (EARTH::uint i = 0; i < 4; ++i)\r
+ {\r
+ _tuners[i] = new PT1Tuner(this, i, multi2_dll);\r
+ tuners[i] = _tuners[i];\r
+ }\r
+\r
+ int ret = sprintf_s(_name, sizeof(_name), "PT%d@%02d%02d%02d",\r
+ deviceInfo->PTn,\r
+ deviceInfo->Bus,\r
+ deviceInfo->Slot,\r
+ deviceInfo->Function);\r
+ if (ret < 0)\r
+ {\r
+ DebugLog3("error: snprintf() (0x%08x)\n", ret);\r
+ int except = EXCEPTION_OTHER;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ // start thread\r
+ EnterCriticalSection(&_cs);\r
+\r
+ HANDLE h;\r
+ unsigned int uiThreadId;\r
+ h = (HANDLE)_beginthreadex(NULL,\r
+ 0,\r
+ PT1Core_transfer,\r
+ this,\r
+ 0,\r
+ &uiThreadId);\r
+ if (h != NULL)\r
+ {\r
+ _transfer = ST_READY;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ bool needSleep = false;\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (_transfer == ST_IDLE)\r
+ {\r
+ done = true;\r
+ }\r
+ else if (_transfer == ST_RUN)\r
+ {\r
+ done = true;\r
+ }\r
+ else if (_transfer == ST_READY)\r
+ {\r
+ needSleep = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ if (needSleep)\r
+ {\r
+ ::Sleep(100); // 100 ms\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ else\r
+ {\r
+ throw EXCEPTION_OTHER;\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+}\r
+\r
+PT1Core::~PT1Core()\r
+{\r
+ EARTH::status status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ }\r
+\r
+ DeleteCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT1Core::~PT1Core()\n");\r
+}\r
+\r
+void PT1Core::release(Tuner *tuner)\r
+{\r
+ DebugLog2("PT1Core::release()\n");\r
+\r
+ // check tuners\r
+ bool needStop = true;\r
+ for (EARTH::uint i = 0; i < MAX_TUNERS; ++i)\r
+ {\r
+ if (_tuners[i] == NULL)\r
+ {\r
+ needStop = false;\r
+ break;\r
+ }\r
+ }\r
+ if (needStop)\r
+ {\r
+ // stop transfer thread\r
+ EnterCriticalSection(&_cs);\r
+ if (_transfer == ST_RUN)\r
+ {\r
+ DebugLog3("_transfer == ST_RUN\n");\r
+ _transfer = ST_STOP;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ done = (_transfer == ST_IDLE);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("koko\n");\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+\r
+ bool exist = false;\r
+ for (EARTH::uint i = 0; i < 4; ++i)\r
+ {\r
+ if (_tuners[i] == tuner)\r
+ {\r
+ _tuners[i] = NULL;\r
+ }\r
+ else if (_tuners[i] != NULL)\r
+ {\r
+ exist = true;\r
+ }\r
+ }\r
+ if (!exist)\r
+ {\r
+ DebugLog3("delete.\n");\r
+ delete this;\r
+ }\r
+}\r
+\r
+const char *PT1Core::name()\r
+{\r
+ DebugLog2("PT1Core::name()\n");\r
+ return _name;\r
+}\r
+\r
+bool PT1Core::getCnAgc(EARTH::uint tuner, EARTH::uint *cn100, EARTH::uint *agc, EARTH::uint *maxAgc)\r
+{\r
+ DebugLog2("PT1Core::getCnAgc()\n");\r
+ bool result = false;\r
+ if ((tuner < MAX_TUNERS) && (cn100 != NULL) && (agc != NULL) && (maxAgc != NULL))\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ EARTH::status status;\r
+ status = _device->GetCnAgc(tuner / 2,\r
+ tuner % 2 == 0 ? EARTH::PT::Device::ISDB_S : EARTH::PT::Device::ISDB_T,\r
+ cn100, agc, maxAgc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool PT1Core::setChannel(EARTH::uint tuner, int channel)\r
+{\r
+ DebugLog2("TunerCore::setChannel(%d, %d)\n", channel, tuner);\r
+\r
+ EARTH::status status;\r
+ bool result = false;\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (tuner >= 0 && tuner < 4)\r
+ {\r
+ if ((tuner % 2) == 0)\r
+ {\r
+ // ISDB-S\r
+ while ((0 <= channel) && (channel <= Tuner::MAX_CHANNELS_ISDB_S))\r
+ {\r
+ EARTH::PT::Device::TmccS tmcc;\r
+ bool tmccIsValid = false;\r
+\r
+ status = _device->SetFrequency((tuner / 2), EARTH::PT::Device::ISDB_S, channel, 0);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetFrequency() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ for (int i = 0; i < 6; ++i)\r
+ {\r
+ status = _device->GetTmccS((tuner / 2), &tmcc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ tmccIsValid = true;\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: Device::GetTmccS() (0x%08x)\n", status);\r
+ }\r
+ ::Sleep(50); // 50 ms\r
+ }\r
+\r
+ result = tmccIsValid;\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // ISDB-T\r
+ while ((0 <= channel) && (channel <= Tuner::MAX_CHANNELS_ISDB_T))\r
+ {\r
+ EARTH::PT::Device::TmccT tmcc;\r
+ bool tmccIsValid = false;\r
+\r
+ status = _device->SetFrequency((tuner / 2), EARTH::PT::Device::ISDB_T, channel, 0);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetFrequency() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ for (int i = 0; i < 2; ++i)\r
+ {\r
+ status = _device->GetTmccT((tuner / 2), &tmcc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ tmccIsValid = true;\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: Device::GetTmccT() (0x%08x)\n", status);\r
+ }\r
+ }\r
+\r
+ result = tmccIsValid;\r
+ break;\r
+ }\r
+ }\r
+ _locked[tuner] = result;\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ return result;\r
+}\r
+\r
+void PT1Core::transfer()\r
+{\r
+ DebugLog2("PT1Core::transfer() called.\n");\r
+\r
+ while (true)\r
+ {\r
+ EARTH::status status;\r
+\r
+ EARTH::PT::Device::BufferInfo bufferInfo;\r
+ status = _device->GetBufferInfo(&bufferInfo);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::GetBufferInfo() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ if (bufferInfo.VirtualSize == 0)\r
+ {\r
+ bufferInfo.VirtualSize = VIRTUAL_SIZE;\r
+ bufferInfo.VirtualCount = VIRTUAL_COUNT;\r
+ bufferInfo.LockSize = LOCK_SIZE;\r
+ status = _device->SetBufferInfo(&bufferInfo);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetBufferInfo() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _transfer = ST_RUN;\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ // In order to examine to what extent DMA transfer or advanced, is cleared to 0 the end of each block\r
+ for (int i = 0; i < VIRTUAL_COUNT; ++i)\r
+ {\r
+ for (int j = 0; j < VIRTUAL_SIZE; ++j)\r
+ {\r
+ for (int k = 0; k < BLOCK_COUNT; ++k)\r
+ {\r
+ clearBlock(i, j, k);\r
+ }\r
+ }\r
+ }\r
+ \r
+ // reset transfer counter\r
+ status = _device->ResetTransferCounter();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::ResetTransferCounter() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+ \r
+ // increment transfer counter\r
+ bool flag = false;\r
+ for (int i = 0; i < VIRTUAL_SIZE * VIRTUAL_COUNT; ++i)\r
+ {\r
+ status = _device->IncrementTransferCounter();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::IncrementTransferCounter() (0x%08x)\n", status);\r
+ flag = true;\r
+ break;\r
+ }\r
+ }\r
+ if (flag)\r
+ {\r
+ break;\r
+ }\r
+ \r
+ // enable DMA transfer\r
+ status = _device->SetTransferEnable(true);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTransferEnable(true) (0x%08x)\n", status);\r
+ break;\r
+ }\r
+ \r
+ _virtualIndex = 0;\r
+ _imageIndex = 0;\r
+ _blockIndex = 0;\r
+ \r
+ DebugLog2("transfer start.\n");\r
+ while (true)\r
+ {\r
+ if (!waitBlock())\r
+ {\r
+ break;\r
+ }\r
+ \r
+ copyBlock();\r
+ \r
+ if (!dispatchBlock())\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ DebugLog2("transfer stop.\n");\r
+\r
+ status = _device->SetTransferEnable(false);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTransferEnable(false) (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ done = (_transfer != ST_RUN);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ break;\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _transfer = ST_IDLE;\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT1Core::transfer() end.\n");\r
+}\r
+\r
+uint32_t PT1Core::offset(uint32_t imageIndex, uint32_t blockIndex, uint32_t additionalOffset)\r
+{\r
+ blockIndex += BLOCK_COUNT * imageIndex;\r
+ uint32_t offset = (BLOCK_SIZE * blockIndex + additionalOffset) / sizeof(uint32_t);\r
+ return offset;\r
+}\r
+\r
+uint32_t PT1Core::offset(uint32_t imageIndex, uint32_t blockIndex)\r
+{\r
+ return offset(imageIndex, blockIndex, (BLOCK_SIZE - sizeof(uint32_t)));\r
+}\r
+\r
+uint32_t PT1Core::read(uint32_t virtualIndex, uint32_t imageIndex, uint32_t blockIndex)\r
+{\r
+ void *voidPtr;\r
+ if (_device->GetBufferPtr(virtualIndex, &voidPtr) != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::GetBufferPtr() :read\n");\r
+ return 0;\r
+ }\r
+\r
+ volatile const uint32_t *ptr = (volatile const uint32_t *)voidPtr;\r
+ if (ptr != NULL)\r
+ {\r
+ return ptr[offset(imageIndex, blockIndex)];\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("ptr is NULL (read)\n");\r
+ }\r
+ return 0;\r
+}\r
+\r
+void PT1Core::clearBlock(uint32_t virtualIndex, uint32_t imageIndex, uint32_t blockIndex)\r
+{\r
+ void *voidPtr = NULL;\r
+ if (_device->GetBufferPtr(virtualIndex, &voidPtr) != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::GetBufferPtr() :clearBlock\n");\r
+ return;\r
+ }\r
+\r
+ uint32_t *ptr = (uint32_t *)voidPtr;\r
+ if (ptr != NULL)\r
+ {\r
+ ptr[offset(imageIndex, blockIndex)] = 0;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("ptr is NULL (clearBlock)");\r
+ }\r
+}\r
+\r
+bool PT1Core::waitBlock()\r
+{\r
+ bool result = true;\r
+ while (result)\r
+ {\r
+ /*\r
+ EARTH::OS::Thread::Sleep((10)*1000*1000); // 10 ms\r
+ */\r
+ ::Sleep(10);\r
+\r
+ //\r
+ if (read(_virtualIndex, _imageIndex, _blockIndex) != 0)\r
+ {\r
+ break;\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ result = (_transfer == ST_RUN);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return result;\r
+}\r
+\r
+void PT1Core::copyBlock()\r
+{\r
+ void *voidPtr;\r
+ if (_device->GetBufferPtr(_virtualIndex, &voidPtr) != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::GetBufferPtr(): copyBlock\n");\r
+ return;\r
+ }\r
+\r
+ uint32_t *srcPtr = (uint32_t *)voidPtr;\r
+\r
+ srcPtr += offset(_imageIndex, _blockIndex, 0);\r
+\r
+ memcpy(_buffer, srcPtr, BLOCK_SIZE);\r
+\r
+ //\r
+ srcPtr[BLOCK_SIZE / sizeof(*srcPtr) - 1] = 0;\r
+\r
+ if (BLOCK_COUNT <= ++_blockIndex)\r
+ {\r
+ _blockIndex = 0;\r
+\r
+ //\r
+ if (_device->IncrementTransferCounter() != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::IncrementTransferCounter()\n");\r
+ return;\r
+ }\r
+\r
+ if (VIRTUAL_SIZE <= ++_imageIndex)\r
+ {\r
+ _imageIndex = 0;\r
+ if (VIRTUAL_COUNT <= ++_virtualIndex)\r
+ {\r
+ _virtualIndex = 0;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+bool PT1Core::dispatchBlock()\r
+{\r
+ const uint32_t *ptr = (uint32_t *)_buffer;\r
+\r
+ uint32_t i;\r
+ for (i = 0; i < BLOCK_SIZE / sizeof(*ptr); ++i)\r
+ {\r
+ uint32_t packet = ptr[i];\r
+\r
+ uint32_t packetId = BIT_SHIFT_MASK(packet, 29, 3);\r
+ uint32_t packetError = BIT_SHIFT_MASK(packet, 24, 1);\r
+\r
+ if (packetError)\r
+ {\r
+ // check error\r
+ EARTH::PT::Device::TransferInfo info;\r
+ if (_device->GetTransferInfo(&info) != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::GetTransferInfo()\n");\r
+ return false;\r
+ }\r
+\r
+ if (info.TransferCounter1)\r
+ {\r
+ DebugLog3("Transfer counter is now less than 1\n");\r
+ }\r
+ else if (info.BufferOverflow)\r
+ {\r
+ DebugLog3("Buffer Overflow\n");\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("Transfer error\n");\r
+ }\r
+ return false;\r
+ }\r
+\r
+ if ((1 <= packetId) && (packetId <= 4))\r
+ {\r
+ if (_locked[packetId - 1] && (_tuners[packetId - 1] != NULL))\r
+ {\r
+ _tuners[packetId - 1]->addPacket(packet);\r
+ }\r
+ }\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+} // PT1\r
+} // device\r
+} // ry0\r
+\r
--- /dev/null
+//\r
+// PT1Core.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_PT1_PT1CORE_H__\r
+#define __RY0_DEVICE_PT1_PT1CORE_H__\r
+\r
+#include <stdint.h>\r
+#include <windows.h>\r
+#include <process.h>\r
+#include "EARTH_PT.h"\r
+#include "ry0/device/Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT1\r
+{\r
+\r
+class PT1Tuner;\r
+\r
+class PT1Core\r
+{\r
+ friend class PT1Tuner;\r
+\r
+public:\r
+ static const int EXCEPTION_NEW_DEVICE = 0x00000001;\r
+ static const int EXCEPTION_DELETE = 0x00000002;\r
+ static const int EXCEPTION_OPEN = 0x00000004;\r
+ static const int EXCEPTION_CLOSE = 0x00000008;\r
+ static const int EXCEPTION_INIT_TUNER = 0x00000010;\r
+ static const int EXCEPTION_SET_TUNER_POWER_RESET = 0x00000020;\r
+ static const int EXCEPTION_SET_TUNER_SLEEP = 0x00000040;\r
+ static const int EXCEPTION_SET_STREAM_ENABLE = 0x00000080;\r
+ static const int EXCEPTION_SET_STREAM_GRAY = 0x00000100;\r
+ static const int EXCEPTION_OTHER = 0x80000000;\r
+\r
+ static const int MAX_TUNERS = 4;\r
+ static const int PAGE_SIZE = 4096;\r
+ static const int PAGE_COUNT = 47;\r
+ static const int PACKET_SIZE = 188;\r
+ static const int VIRTUAL_SIZE = 4;\r
+ static const int VIRTUAL_COUNT = 16;\r
+ static const int LOCK_SIZE = 4;\r
+ static const int BUFFER_PAGE_COUNT = 511;\r
+ static const int BLOCK_COUNT = 2;\r
+ static const int BLOCK_SIZE = (PAGE_SIZE * BUFFER_PAGE_COUNT / BLOCK_COUNT);\r
+\r
+\r
+private:\r
+ CRITICAL_SECTION _cs;\r
+ EARTH::PT::Device * _device;\r
+ char _name[64];\r
+\r
+ PT1Tuner * _tuners[MAX_TUNERS];\r
+ bool _locked[MAX_TUNERS];\r
+\r
+ // for DMA Transfer\r
+ enum {\r
+ ST_IDLE = 0,\r
+ ST_READY,\r
+ ST_RUN,\r
+ ST_STOP} _transfer;\r
+ uint32_t _virtualIndex;\r
+ uint32_t _imageIndex;\r
+ uint32_t _blockIndex;\r
+ uint8_t _buffer[BLOCK_SIZE];\r
+\r
+ uint32_t offset(uint32_t imageIndex, uint32_t blockIndex, uint32_t additionalOffset);\r
+ uint32_t offset(uint32_t imageIndex, uint32_t blockIndex);\r
+ uint32_t read(uint32_t virtualIndex, uint32_t imageIndex, uint32_t blockIndex);\r
+ void clearBlock(uint32_t virtualIndex, uint32_t imageIndex, uint32_t blockIndex);\r
+ bool waitBlock();\r
+ void copyBlock();\r
+ bool dispatchBlock();\r
+\r
+ //\r
+ PT1Core(EARTH::PT::Bus *bus, const EARTH::PT::Bus::DeviceInfo *deviceInfo, Tuner *tuners[4], HMODULE multi2_dll);\r
+ ~PT1Core();\r
+\r
+ void release(Tuner *tuner);\r
+\r
+public:\r
+ bool getCnAgc(EARTH::uint tuner, EARTH::uint *cn100, EARTH::uint *agc, EARTH::uint *maxAgc);\r
+ bool setChannel(EARTH::uint tuner, int channel);\r
+\r
+ const char *name();\r
+\r
+ void transfer();\r
+};\r
+\r
+} // PT1\r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_PT1_PT1CORE_H__\r
--- /dev/null
+//\r
+// PT1Tuner.cpp\r
+//\r
+\r
+#include <io.h>\r
+#include <new>\r
+#include <share.h>\r
+#include <winsock2.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+#include "ry0/device/PT1/PT1Tuner.h"\r
+#include "ry0/device/PT1/PT1Core.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT1\r
+{\r
+\r
+static HMODULE module_ = NULL; // for scan\r
+\r
+PT1Tuner::PT1Tuner(PT1Core *core, uint32_t tuner, HMODULE multi2_dll)\r
+{\r
+ DebugLog2("PT1Tuner::PT1Tuner()\n");\r
+\r
+ InitializeCriticalSection(&_cs);\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ _core = core;\r
+ _tuner = tuner;\r
+ _listener = NULL;\r
+ memset(_name, sizeof(_name), 0x00);\r
+ _channel = -1;\r
+ _recording = false;\r
+ _recfd = -1;\r
+ _locked = false;\r
+\r
+ _b25 = NULL;\r
+ _bcas = NULL;\r
+\r
+ while (multi2_dll != NULL)\r
+ {\r
+ // create "B25" & initialize\r
+ ARIB_STD_B25 *(*func_b25)();\r
+ func_b25 = reinterpret_cast<ARIB_STD_B25 *(*)()>(::GetProcAddress(multi2_dll, "create_arib_std_b25"));\r
+ if (func_b25 == NULL)\r
+ {\r
+ DebugLog0("b25 func address get ng.");\r
+ break;\r
+ }\r
+ _b25 = func_b25();\r
+ if (_b25 == NULL)\r
+ {\r
+ DebugLog0("b25 create ng.");\r
+ break;\r
+ }\r
+\r
+ int ret = _b25->set_multi2_round(_b25, 4);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set multi2 round ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ ret = _b25->set_strip(_b25, 0);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set strip ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ ret = _b25->set_emm_proc(_b25, 0);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set emm proc ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ // create "B-CAS" & initialize\r
+ B_CAS_CARD *(*func_bcas)();\r
+ func_bcas = reinterpret_cast<B_CAS_CARD *(*)()>(::GetProcAddress(multi2_dll, "create_b_cas_card"));\r
+ if (func_bcas == NULL)\r
+ {\r
+ // 関数アドレス取得NG\r
+ DebugLog0("bcas func address get ng.");\r
+ break;\r
+ }\r
+ _bcas = func_bcas();\r
+ if (_bcas == NULL)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("bcas create ng.");\r
+ break;\r
+ }\r
+\r
+ ret = _bcas->init(_bcas);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ DebugLog0("bcas init ng. %d", ret);\r
+ break;\r
+ }\r
+ ret = _b25->set_b_cas_card(_b25, _bcas);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ DebugLog0("b25 set bcas card ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ DebugLog2("b25 & bcas initialize success.");\r
+ break;\r
+ }\r
+\r
+// WSADATA wsaData;\r
+// WSAStartup(MAKEWORD(2,0), &wsaData);\r
+\r
+ // temporary\r
+ if ((_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)\r
+ {\r
+ DebugLog0("fatal error occured: socket(): 0x%08x", WSAGetLastError());\r
+ abort();\r
+ }\r
+ struct sockaddr_in own_addr;\r
+ own_addr.sin_family = AF_INET;\r
+ own_addr.sin_port = 0;\r
+ own_addr.sin_addr.s_addr = INADDR_ANY;\r
+ if (bind(_udp, (struct sockaddr *)&own_addr, sizeof(own_addr)) == SOCKET_ERROR)\r
+ {\r
+ DebugLog0("fatal error occured: bind()\n");\r
+ abort();\r
+ }\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+PT1Tuner::~PT1Tuner()\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ if (_bcas != NULL)\r
+ {\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ }\r
+ if (_b25 != NULL)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ }\r
+ if (_recfd != -1)\r
+ {\r
+ _recfd = -1;\r
+ }\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+ }\r
+ _listener = NULL;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ _core->release(this);\r
+\r
+ closesocket(_udp);\r
+\r
+ DeleteCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT1Tuner::~PT1Tuner()\n");\r
+}\r
+\r
+void PT1Tuner::setListener(Listener *listener)\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ _listener = listener;\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+const char *PT1Tuner::name()\r
+{\r
+ DebugLog2("PT1Tuner::name()\n");\r
+\r
+ if (strlen(_name) == 0)\r
+ {\r
+ sprintf_s(_name, sizeof(_name), "%s-%02d", _core->name(), _tuner);\r
+ }\r
+\r
+ return _name;\r
+}\r
+\r
+Tuner::Type PT1Tuner::type()\r
+{\r
+ DebugLog2("PT1Tuner::type()\n");\r
+\r
+ switch (_tuner)\r
+ {\r
+ case 0:\r
+ case 2:\r
+ return ISDB_S;\r
+ case 1:\r
+ case 3:\r
+ return ISDB_T;\r
+ }\r
+ return TYPE_NA;\r
+}\r
+\r
+Tuner::LnbPower PT1Tuner::lnbPower()\r
+{\r
+ DebugLog2("PT1Tuner::lnbPower()\n");\r
+\r
+ return LNB_POWER_OFF;\r
+}\r
+\r
+bool PT1Tuner::getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc)\r
+{\r
+ DebugLog2("PT1Tuner::getCnAgc()\n");\r
+ bool result = false;\r
+ if ((cn100 != NULL) && (agc != NULL) && (maxAgc != NULL))\r
+ {\r
+ result = _core->getCnAgc(_tuner, (EARTH::uint *)cn100, (EARTH::uint *)agc, (EARTH::uint *)maxAgc);\r
+ }\r
+ return result;\r
+}\r
+\r
+int PT1Tuner::channel()\r
+{\r
+ int result = -1;\r
+ EnterCriticalSection(&_cs);\r
+ result = _channel;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT1Tuner::setChannel(int channel)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (_channel != channel)\r
+ {\r
+ if (!_recording)\r
+ {\r
+ result = _core->setChannel(_tuner, channel);\r
+ if (result)\r
+ {\r
+ _channel = channel;\r
+ }\r
+ else\r
+ {\r
+ _channel = -1;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT1Tuner::startRecording(int fd)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if ((!_recording) && (!_locked) && (fd >= 0))\r
+ {\r
+ _recording = true;\r
+ _locked = true;\r
+ _recfd = fd;\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+int PT1Tuner::stopRecording()\r
+{\r
+ int result = -1;\r
+ EnterCriticalSection(&_cs);\r
+ if (_recording)\r
+ {\r
+ _recording = false;\r
+ if (_dst_addr.sin_family != AF_INET)\r
+ {\r
+ _locked = false;\r
+ }\r
+ result = _recfd;\r
+ _recfd = -1;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT1Tuner::isRecording()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = _recording;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT1Tuner::lock()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (!_locked)\r
+ {\r
+ _locked = true;\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+void PT1Tuner::unlock()\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ if (_locked)\r
+ {\r
+ if (!_recording)\r
+ {\r
+ _locked = false;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+bool PT1Tuner::isLocked()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = _locked;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT1Tuner::startStreaming(struct sockaddr_in *addr)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (_dst_addr.sin_family == AF_UNSPEC)\r
+ {\r
+ if (addr->sin_family == AF_INET)\r
+ {\r
+ _dst_addr = *addr;\r
+ _locked = true;\r
+ result = true;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+void PT1Tuner::stopStreaming()\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+ if (!_recording)\r
+ {\r
+ _locked = false;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+bool PT1Tuner::isStreaming()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = (_dst_addr.sin_family == AF_INET);\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+\r
+void PT1Tuner::addPacket(uint32_t packet)\r
+{\r
+// DebugLog3("%s\n", __FUNCTION__);\r
+// return;\r
+\r
+ uint32_t packetCounter = BIT_SHIFT_MASK(packet, 26, 3);\r
+ uint32_t packetStart = BIT_SHIFT_MASK(packet, 25, 1);\r
+ uint32_t packetData = BIT_SHIFT_MASK(packet, 0, 24);\r
+\r
+ // check counter\r
+ uint32_t count = BIT_SHIFT_MASK(_count, 0, 3);\r
+ _count++;\r
+\r
+ if (packetCounter != count)\r
+ {\r
+// DebugLog3("counter value is invalid.\n");\r
+ }\r
+\r
+ // check packet start offset flag\r
+ if (packetStart)\r
+ {\r
+ if (BIT_SHIFT_MASK(packetData, 15, 1))\r
+ {\r
+// DebugLog3("There is an error that could not be corrected by Reed-Solomon decoding\n");\r
+ }\r
+ else\r
+ {\r
+ // check sync byte\r
+ if (BIT_SHIFT_MASK(packetData, 16, 8) != 0x47)\r
+ {\r
+// DebugLog3("The first byte of the packet does not have an 0x47.\n");\r
+ }\r
+ }\r
+\r
+ if (_packetOffset != 0)\r
+ {\r
+// DebugLog3("The previous packet was not completed.\n");\r
+ }\r
+ _packetOffset = 0;\r
+ }\r
+\r
+ // copy\r
+ uint32_t i;\r
+ for (i = 0; i < 3; ++i)\r
+ {\r
+ if (_packetOffset < PT1Core::PACKET_SIZE)\r
+ {\r
+ _buffer[PT1Core::PACKET_SIZE * _packetCount + _packetOffset] = BIT_SHIFT_MASK(packetData, 8*(2-i), 8);\r
+ _packetOffset++;\r
+ }\r
+ }\r
+ if (PT1Core::PACKET_SIZE <= _packetOffset)\r
+ {\r
+ // One packet is complete\r
+ _packetOffset = 0;\r
+\r
+ if (PT1Core::PAGE_SIZE * PT1Core::PAGE_COUNT / PT1Core::PACKET_SIZE <= ++_packetCount)\r
+ {\r
+ _packetCount = 0;\r
+\r
+ uint8_t *ptr = _buffer;\r
+ int32_t size = (PT1Core::PAGE_SIZE * PT1Core::PAGE_COUNT);\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (_b25 != NULL)\r
+ {\r
+ // MULTI2 Decode\r
+ ARIB_STD_B25_BUFFER sBuffer, dBuffer;\r
+ sBuffer.data = _buffer;\r
+ sBuffer.size = (PT1Core::PAGE_SIZE * PT1Core::PAGE_COUNT);\r
+ dBuffer.data = NULL;\r
+ dBuffer.size = 0;\r
+\r
+ int ret = _b25->put(_b25, &sBuffer);\r
+ if (ret >= 0)\r
+ {\r
+ ret = _b25->get(_b25, &dBuffer);\r
+ if (ret >= 0)\r
+ {\r
+ ptr = dBuffer.data;\r
+ size = dBuffer.size;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("_b25->get() NG. %d\n", ret);\r
+ _b25->reset(_b25);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("_b25->put() NG. %d\n", ret);\r
+ _b25->reset(_b25);\r
+ }\r
+ }\r
+\r
+ // recording\r
+ if (_recfd >= 0)\r
+ {\r
+ _write(_recfd, ptr, size);\r
+ }\r
+\r
+ // streaming\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+#if 1\r
+ int32_t offset = 0;\r
+ int32_t unit = 188 * 4;\r
+// int32_t unit = 188 * 8;\r
+ int32_t remain = size;\r
+ while (remain > 0)\r
+ {\r
+ if (remain < unit)\r
+ {\r
+ unit = remain;\r
+ }\r
+ int len = sendto(_udp, (const char *)&ptr[offset], unit, 0, (struct sockaddr *)&_dst_addr, sizeof(struct sockaddr_in));\r
+ if (len > 0)\r
+ {\r
+ remain -= len;\r
+ offset += len;\r
+ }\r
+ else\r
+ {\r
+ char tmp[1024];\r
+ strerror_s(tmp, sizeof(tmp), errno);\r
+ DebugLog3("len = %d, %s", len, tmp);\r
+ break;\r
+ }\r
+ }\r
+#else\r
+ sendto(_udp, (const char *)ptr, size, 0, (struct sockaddr *)&_dst_addr, sizeof(struct sockaddr_in));\r
+#endif \r
+ }\r
+ \r
+ // listener\r
+ if (_listener != NULL)\r
+ {\r
+ _listener->put(ptr, size);\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ }\r
+ }\r
+}\r
+\r
+int PT1Tuner::scan(Tuner *tuners[], HMODULE multi2_dll)\r
+{\r
+ DebugLog2("%s()\n", __FUNCTION__);\r
+\r
+ if (module_ == NULL)\r
+ {\r
+ module_ = ::LoadLibrary(L"SDK_EARTHSOFT_PT1_PT2.dll");\r
+ if (module_ == NULL)\r
+ {\r
+ DebugLog0("Can't load library: ");\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ EARTH::PT::Bus::NewBusFunction function = reinterpret_cast<EARTH::PT::Bus::NewBusFunction>(::GetProcAddress(module_, "_"));\r
+ if (function == NULL)\r
+ {\r
+ DebugLog0("internal error.");\r
+ return -1;\r
+ }\r
+\r
+ EARTH::PT::Bus *bus = NULL;\r
+ EARTH::status status = function(&bus);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: NewBusFunction() 0x%08x", status);\r
+ return -1;\r
+ }\r
+\r
+ EARTH::uint version;\r
+ bus->GetVersion(&version);\r
+ if ((version >> 8) != 2)\r
+ {\r
+ DebugLog3("no support version");\r
+ return -1;\r
+ }\r
+\r
+ EARTH::PT::Bus::DeviceInfo deviceInfo[ry0::device::MAX_DEVICES];\r
+ EARTH::uint deviceInfoCount = sizeof(deviceInfo)/sizeof(*deviceInfo);\r
+ bus->Scan(deviceInfo, &deviceInfoCount, 3);\r
+\r
+ DebugLog2("deviceInfoCount = %d", deviceInfoCount);\r
+\r
+ int tunerCount = 0;\r
+\r
+ for (EARTH::uint i = 0; i < deviceInfoCount; ++i)\r
+ {\r
+ const EARTH::PT::Bus::DeviceInfo *info = &deviceInfo[i];\r
+ if (info->BadBitCount == 0)\r
+ {\r
+ try\r
+ {\r
+ PT1Core *core = new PT1Core(bus, info, &tuners[tunerCount], multi2_dll);\r
+ tunerCount += PT1Core::MAX_TUNERS;\r
+ }\r
+ catch (int e)\r
+ {\r
+ DebugLog0("throw %d", e);\r
+ }\r
+ catch (const std::bad_alloc& e)\r
+ {\r
+ DebugLog0("throw bad_alloc %s", e);\r
+ }\r
+ }\r
+ }\r
+\r
+ return tunerCount;\r
+}\r
+\r
+} // PT1\r
+} // device\r
+} // ry0\r
+\r
+\r
--- /dev/null
+//\r
+// PT1Tuner.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_PT1_PT1TUNER_H__\r
+#define __RY0_DEVICE_PT1_PT1TUNER_H__\r
+\r
+#include <stdint.h>\r
+#include "ry0/device/Tuner.h"\r
+#include "b25/arib_std_b25.h"\r
+#include "b25/b_cas_card.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT1\r
+{\r
+\r
+static const int PAGE_SIZE = 4096;\r
+static const int PAGE_COUNT = 47;\r
+static const int PACKET_SIZE = 188;\r
+static const int VIRTUAL_SIZE = 4;\r
+static const int VIRTUAL_COUNT = 16;\r
+static const int LOCK_SIZE = 4;\r
+static const int BUFFER_PAGE_COUNT = 511;\r
+static const int BLOCK_COUNT = 2;\r
+static const int BLOCK_SIZE = (PAGE_SIZE * BUFFER_PAGE_COUNT / BLOCK_COUNT);\r
+\r
+class PT1Core;\r
+\r
+class PT1Tuner : public Tuner\r
+{\r
+ friend class PT1Core;\r
+\r
+private:\r
+ CRITICAL_SECTION _cs;\r
+ PT1Core * _core;\r
+ Listener * _listener;\r
+ uint32_t _tuner;\r
+ char _name[64];\r
+ int _channel;\r
+ bool _recording;\r
+ int _recfd;\r
+ bool _locked;\r
+\r
+ // temporary\r
+ SOCKET _udp;\r
+ struct sockaddr_in _dst_addr;\r
+\r
+ uint32_t _count;\r
+ uint32_t _packetCount;\r
+ uint32_t _packetOffset;\r
+ uint8_t _buffer[PAGE_SIZE * PAGE_COUNT];\r
+\r
+ ARIB_STD_B25 * _b25;\r
+ B_CAS_CARD * _bcas;\r
+\r
+ PT1Tuner(PT1Core *core, uint32_t tuner, HMODULE multi2_dll);\r
+ ~PT1Tuner();\r
+\r
+ void addPacket(uint32_t packet);\r
+\r
+public:\r
+ void setListener(Listener *listener);\r
+ const char *name();\r
+ Type type();\r
+ LnbPower lnbPower();\r
+ bool getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc);\r
+ int channel();\r
+ bool setChannel(int channel);\r
+ bool startRecording(int fd);\r
+ int stopRecording();\r
+ bool isRecording();\r
+ bool lock();\r
+ void unlock();\r
+ bool isLocked();\r
+\r
+ // temporary\r
+ bool startStreaming(struct sockaddr_in *);\r
+ void stopStreaming();\r
+ bool isStreaming();\r
+\r
+ //\r
+ static int scan(Tuner *tuners[], HMODULE multi2_dll);\r
+};\r
+\r
+} // PT1\r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_PT1_PT1TUNER_H__\r
--- /dev/null
+// ========================================================================================
+// EARTH_PT.h
+// version 2.0 (2009.09.30)
+// ========================================================================================
+
+#ifndef _EARTH_PT_H
+#define _EARTH_PT_H
+
+#include "Prefix.h"
+
+namespace EARTH {
+namespace PT {
+ class Device;
+ class Device2;
+
+ // +------------+
+ // | \83o\83X\83N\83\89\83X |
+ // +------------+
+ // \83o\83X\8fã\82Ì\83f\83o\83C\83X\82ð\97ñ\8b\93\82µ\82Ü\82·\81B\82Ü\82½\83f\83o\83C\83X\83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬\82µ\82Ü\82·\81B
+ class Bus {
+ public:
+ // [\8b@\94\] Bus \83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬
+ // [\90à\96¾] \83h\83\89\83C\83o\96¼ \82Í "windrvr6_EARTHSOFT_PT2", "windrvr6_EARTHSOFT_PT1" \82Ì\8f\87\82É\8e\8e\8ds\82µ\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 bus \82ª NULL
+ // STATUS_WDAPI_LOAD_ERROR \81¨ LoadLibrary(TEXT("wdapi1002.dll")) \82Ì\95Ô\92l\82ª NULL
+ // STATUS_WD_DriverName_ERROR \81¨ WD_DriverName() \82Ì\95Ô\92l\82ª NULL
+ // STATUS_WD_Open_ERROR \81¨ WD_Open() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_Version_ERROR \81¨ WD_Version() \82Å\83G\83\89\81[\82ª\94\90¶\81B\82Ü\82½\82Í\83o\81[\83W\83\87\83\93\82ª 10.0.2 \82Å\82È\82¢
+ // STATUS_WD_License_ERROR \81¨ WD_License() \82Å\83G\83\89\81[\82ª\94\90¶
+ typedef status (*NewBusFunction)(Bus **bus);
+
+ // [\8b@\94\] \83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú
+ // [\90à\96¾] delete \82Í\8eg\82¦\82Ü\82¹\82ñ\81B\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_ALL_DEVICES_MUST_BE_DELETED_ERROR \81¨ NewDevice() \82Å\90¶\90¬\82³\82ê\82½\83f\83o\83C\83X\82ª\91S\82Ä Delete() \82³\82ê\82Ä\82¢\82È\82¢
+ virtual status Delete() = 0;
+
+ // [\8b@\94\] \83\\83t\83g\83E\83F\83A\83o\81[\83W\83\87\83\93\82ð\8eæ\93¾
+ // [\90à\96¾] \83o\81[\83W\83\87\83\93\82ª 2.0 \82Ì\8fê\8d\87\81A\92l\82Í 0x200 \82É\82È\82è\82Ü\82·\81B
+ // \8fã\88Ê 24 \83r\83b\83g\82ª\93¯\82¶\82Å\82 \82ê\82Î\83o\83C\83i\83\8a\8cÝ\8a·\82É\82È\82é\82æ\82¤\82É\93w\82ß\82Ü\82·\82Ì\82Å\81A
+ // ((version >> 8) == 2) \82Å\82 \82é\82©\82ð\83`\83F\83b\83N\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 version \82ª NULL
+ virtual status GetVersion(uint *version) const = 0;
+
+ // \83f\83o\83C\83X\8fî\95ñ
+ struct DeviceInfo {
+ uint Bus; // PCI \83o\83X\94Ô\8d\86
+ uint Slot; // PCI \83f\83o\83C\83X\94Ô\8d\86
+ uint Function; // PCI \83t\83@\83\93\83N\83V\83\87\83\93\94Ô\8d\86 (\90³\8fí\93®\8dì\8e\9e\82Í\95K\82¸ 0 \82É\82È\82è\82Ü\82·)
+ uint PTn; // \95i\94Ô (PT1:1 PT2:2)
+ uint BadBitCount; // PCI \83f\81[\83^\83o\83X\82Ì\83r\83b\83g\89»\82¯\90\94
+ };
+
+ // [\8b@\94\] \94F\8e¯\82³\82ê\82Ä\82¢\82é\83f\83o\83C\83X\82Ì\83\8a\83X\83g\82ð\8eæ\93¾
+ // [\90à\96¾] PCI \83o\83X\82ð\83X\83L\83\83\83\93\82µ\82Ä\88È\89º\82Ì\8fð\8c\8f\82ð\91S\82Ä\96\9e\82½\82·\83f\83o\83C\83X\82ð\83\8a\83X\83g\83A\83b\83v\82µ\82Ü\82·\81B
+ // (PT1) \83x\83\93\83_ID: 0x10ee / \83f\83o\83C\83XID: 0x211a / \83T\83u\83V\83X\83e\83\80\83x\83\93\83_ID: ~0x10ee / \83T\83u\83V\83X\83e\83\80ID: ~0x211a
+ // (PT2) \83x\83\93\83_ID: 0x10ee / \83f\83o\83C\83XID: 0x222a / \83T\83u\83V\83X\83e\83\80\83x\83\93\83_ID: ~0x10ee / \83T\83u\83V\83X\83e\83\80ID: ~0x222a
+ //
+ // \83X\83\8d\83b\83g\82Æ\83{\81[\83h\92[\8eq\82Ì\90Ú\90G\82ª\88«\82¢\8fê\8d\87\81A\82±\82ê\82ç\82Ì ID \82É\83r\83b\83g\89»\82¯\82ª\90¶\82¶\82é\82±\82Æ\82ª\82 \82è\82Ü\82·\81B
+ // \82±\82Ì\82æ\82¤\82È\8fó\8bµ\82Å\82à\83f\83o\83C\83X\82ð\8c\9f\8fo\82Å\82«\82é\82æ\82¤\82É\81AmaxBadBitCount \82Å\83r\83b\83g\89»\82¯\82Ì\8b\96\97e\8fã\8cÀ\82ð\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+ // 64\83r\83b\83g(16\83r\83b\83g\81~4) \82Ì\8ae\83r\83b\83g\82ð\94ä\8ar\82µ\81A\91\8a\88á\83r\83b\83g\90\94\82ª maxBadBitCount \88È\89º\82Ì\83f\83o\83C\83X\82ð\83\8a\83X\83g\83A\83b\83v\82µ\82Ü\82·\81B
+ //
+ // deviceInfoCount \82Í\8cÄ\82Ñ\8fo\82µ\91O\82É\83f\83o\83C\83X\82Ì\8fã\8cÀ\90\94\82ð\8ew\92è\82µ\82Ü\82·\81B\8cÄ\8fo\82µ\8cã\82Í\8c©\82Â\82©\82Á\82½\83f\83o\83C\83X\90\94\82ð\95Ô\82µ\82Ü\82·\81B
+ // maxBadBitCount \82Í 3 \88È\89º\82Ì\92l\82ð\8ew\92è\82µ\82Ü\82·\81B
+ // DeviceInfo::BadBitCount \82ª 0 \82Å\82È\82¢\83f\83o\83C\83X\82ð Device::Open() \82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 deviceInfoPtr, deviceInfoCount \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // \82Ü\82½\82Í\88ø\90\94 maxBadBitCount \82ª 3 \82æ\82è\91å\82«\82¢
+ // STATUS_WD_PciScanCards_ERROR \81¨ WD_PciScanCards \82Å\83G\83\89\81[\82ª\94\90¶
+ virtual status Scan(DeviceInfo *deviceInfoPtr, uint *deviceInfoCount, uint maxBadBitCount = 0) = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬\82·\82é
+ // [\90à\96¾] \83f\83o\83C\83X\83\8a\83\\81[\83X\82Ì\94r\91¼\83`\83F\83b\83N\82Í\82±\82Ì\8aÖ\90\94\82Å\82Í\8ds\82í\82ê\82Ü\82¹\82ñ\81BDevice::Open() \82Å\8ds\82í\82ê\82Ü\82·\81B
+ // Device2 \82Í\94ñ\8cö\8aJ\83C\83\93\83^\81[\83t\83F\81[\83X\82Å\82·\81Bdevice2 \82Í NULL \82É\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 deviceInfoPtr, device \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // \82Ü\82½\82Í\88ø\90\94 device2 \82ª NULL \82Å\82È\82¢
+ virtual status NewDevice(const DeviceInfo *deviceInfoPtr, Device **device, Device2 **device2 = NULL) = 0;
+
+ protected:
+ virtual ~Bus() {}
+ };
+
+ // +----------------+
+ // | \83f\83o\83C\83X\83N\83\89\83X |
+ // +----------------+
+ // \82±\82Ì\83C\83\93\83X\83^\83\93\83X 1 \82Â\82ª\83{\81[\83h 1 \96\87\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+ class Device {
+ public:
+ // ----
+ // \89ð\95ú
+ // ----
+
+ // [\8b@\94\] \83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú
+ // [\90à\96¾] delete \82Í\8eg\82¦\82Ü\82¹\82ñ\81B\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_DEVICE_MUST_BE_CLOSED_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\8fó\91Ô\82È\82Ì\82Å\83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú\82Å\82«\82È\82¢
+ virtual status Delete() = 0;
+
+ // ------------------
+ // \83I\81[\83v\83\93\81E\83N\83\8d\81[\83Y
+ // ------------------
+
+ // [\8b@\94\] \83f\83o\83C\83X\82Ì\83I\81[\83v\83\93
+ // [\90à\96¾] \88È\89º\82Ì\8eè\8f\87\82É\89\88\82Á\82Ä\8ds\82í\82ê\82Ü\82·\81B
+ // 1. \8aù\82É\83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢\82©\82ð\8am\94F\82·\82é\81B
+ // 2. \83\8a\83r\83W\83\87\83\93ID (\83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ \83A\83h\83\8c\83X 0x08) \82ª 0x01 \82Å\82 \82é\82©\82ð\92²\82×\82é\81B
+ // 3. \83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ\82Ì\83f\83o\83C\83X\8cÅ\97L\83\8c\83W\83X\83^\97Ì\88æ\82ð\8eg\82Á\82Ä PCI \83o\83X\82Å\82Ì\83r\83b\83g\89»\82¯\82ª\82È\82¢\82©\82ð\8am\94F\82·\82é\81B
+ // 4. \82±\82Ì SDK \82Å\90§\8cä\82ª\89Â\94\\82È FPGA \89ñ\98H\82Ì\83o\81[\83W\83\87\83\93\82Å\82 \82é\82©\82ð\8am\94F\82·\82é\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_ALREADY_OPEN_ERROR \81¨ \83f\83o\83C\83X\82Í\8aù\82É\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82é
+ // STATUS_WD_PciGetCardInfo_ERROR \81¨ WD_PciGetCardInfo() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_PciGetCardInfo_Bus_ERROR \81¨ \83o\83X\8fî\95ñ\90\94\82ª 1 \88È\8aO
+ // STATUS_WD_PciGetCardInfo_Memory_ERROR \81¨ \83\81\83\82\83\8a\8fî\95ñ\90\94\82ª 1 \88È\8aO
+ // STATUS_WD_CardRegister_ERROR \81¨ WD_CardRegister() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_PciConfigDump_ERROR \81¨ WD_PciConfigDump() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_CONFIG_REVISION_ERROR \81¨ \83\8a\83r\83W\83\87\83\93ID \82ª 0x01 \82Å\82È\82¢
+ // STATUS_PCI_BUS_ERROR \81¨ PCI \83o\83X\82Å\82Ì\83r\83b\83g\89»\82¯\82ª\94\90¶
+ // STATUS_PCI_BASE_ADDRESS_ERROR \81¨ \83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ\82Ì BaseAddress0 \82ª 0
+ // STATUS_FPGA_VERSION_ERROR \81¨ \91Î\89\9e\82µ\82Ä\82¢\82È\82¢ FPGA \89ñ\98H\83o\81[\83W\83\87\83\93
+ // STATUS_WD_CardCleanupSetup_ERROR \81¨ WD_CardCleanupSetup() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_DCM_LOCK_TIMEOUT_ERROR \81¨ DCM \82ª\88ê\92è\8e\9e\8aÔ\8co\89ß\8cã\82à\83\8d\83b\83N\8fó\91Ô\82É\82È\82ç\82È\82¢
+ // STATUS_DCM_SHIFT_TIMEOUT_ERROR \81¨ DCM \82Ì\83t\83F\81[\83Y\83V\83t\83g\82ª\88ê\92è\8e\9e\8aÔ\8co\89ß\8cã\82à\8a®\97¹\82µ\82È\82¢
+ virtual status Open() = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\82Ì\83N\83\8d\81[\83Y
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ virtual status Close() = 0;
+
+ // --------------------------------------
+ // PCI \83N\83\8d\83b\83N\83J\83E\83\93\83^\81E\83\8c\83C\83e\83\93\83V\83^\83C\83}
+ // --------------------------------------
+
+ // [\8b@\94\] PCI \83N\83\8d\83b\83N\83J\83E\83\93\83^\82ð\8eæ\93¾
+ // [\90à\96¾] \83J\83E\83\93\83^\92·\82Í 32 \83r\83b\83g\82Å\82·\81B0xffffffff \82Ì\8e\9f\82Í 0 \82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 counter \82ª NULL
+ virtual status GetPciClockCounter(uint *counter) = 0;
+
+ // [\8b@\94\] PCI \83\8c\83C\83e\83\93\83V\83^\83C\83}\92l\82Ì\90Ý\92è\81E\8eæ\93¾
+ // [\90à\96¾] \89º\88Ê 3 \83r\83b\83g\82Í\8eÀ\91\95\82³\82ê\82Ä\82¢\82È\82¢\82½\82ß\81A\8eæ\93¾\82µ\82½\92l\82Í 8 \82Ì\94{\90\94\82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 latencyTimer \82ª NULL (GetPciLatencyTimer \82Ì\82Ý)
+ // STATUS_WD_PciConfigDump_ERROR \81¨ WD_PciConfigDump() \82Å\83G\83\89\81[\82ª\94\90¶
+ virtual status SetPciLatencyTimer(byte latencyTimer) = 0;
+ virtual status GetPciLatencyTimer(byte *latencyTimer) const = 0;
+
+ // ------------
+ // \93d\8c¹\81E\8f\89\8aú\89»
+ // ------------
+
+ enum LnbPower {
+ LNB_POWER_OFF, // \83I\83t
+ LNB_POWER_15V, // 15V \8fo\97Í
+ LNB_POWER_11V // 11V \8fo\97Í (\90³\8am\82É\82Í PCI \83X\83\8d\83b\83g\82Ì +12V \82©\82ç 0.6V \92ö\93x\82ð\88ø\82¢\82½\92l)
+ };
+
+ // [\8b@\94\] LNB \93d\8c¹\90§\8cä
+ // [\90à\96¾] \83`\83\85\81[\83i\81[\82Ì\93d\8c¹\82Æ\82Í\93Æ\97§\82É\90§\8cä\89Â\94\\82Å\82·\81B\83f\83t\83H\83\8b\83g\92l\82Í LNB_POWER_OFF \82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 lnbPower \82ª NULL (GetLnbPower \82Ì\82Ý)
+ virtual status SetLnbPower(LnbPower lnbPower) = 0;
+ virtual status GetLnbPower(LnbPower *lnbPower) const = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\82ð\83N\83\8d\81[\83Y\81i\88Ù\8fí\8fI\97¹\82É\82Æ\82à\82È\82¤\83N\83\8d\81[\83Y\82ð\8aÜ\82Þ\81j\8e\9e\82Ì LNB \93d\8c¹\90§\8cä
+ // [\90à\96¾] \83f\83t\83H\83\8b\83g\92l\82Í LNB_POWER_OFF \82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 lnbPower \82ª NULL (GetLnbPowerWhenClose \82Ì\82Ý)
+ // STATUS_WD_CardCleanupSetup_ERROR \81¨ WD_CardCleanupSetup() \82Å\83G\83\89\81[\82ª\94\90¶ (SetLnbPowerWhenClose \82Ì\82Ý)
+ virtual status SetLnbPowerWhenClose(LnbPower lnbPower) = 0;
+ virtual status GetLnbPowerWhenClose(LnbPower *lnbPower) const = 0;
+
+ // [\8b@\94\] \83`\83\85\81[\83i\81[\93d\8c¹\81E\83n\81[\83h\83E\83F\83A\83\8a\83Z\83b\83g\90§\8cä
+ // [\90à\96¾] TUNER_POWER_ON_RESET_ENABLE \82©\82ç TUNER_POWER_ON_RESET_DISABLE \82Ì\91J\88Ú\82É\82Í\8dÅ\92á 15ms \82Ì\91Ò\82¿\8e\9e\8aÔ\82ª\95K\97v\82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tunerPowerReset \82ª NULL (GetTunerPowerReset \82Ì\82Ý)
+ enum TunerPowerReset { // \93d\8c¹\81^\83n\81[\83h\83E\83F\83A\83\8a\83Z\83b\83g
+ TUNER_POWER_OFF, // \83I\83t\81^\83C\83l\81[\83u\83\8b
+ TUNER_POWER_ON_RESET_ENABLE, // \83I\83\93\81^\83C\83l\81[\83u\83\8b
+ TUNER_POWER_ON_RESET_DISABLE // \83I\83\93\81^\83f\83B\83Z\81[\83u\83\8b
+ };
+ virtual status SetTunerPowerReset(TunerPowerReset tunerPowerReset) = 0;
+ virtual status GetTunerPowerReset(TunerPowerReset *tunerPowerReset) const = 0;
+
+ // [\8b@\94\] \83`\83\85\81[\83i\81[\8f\89\8aú\89»
+ // [\90à\96¾] SetTunerPowerReset(TUNER_POWER_ON_RESET_DISABLE) \82©\82ç\8dÅ\92á 1\83Ês \8co\89ß\8cã\82É 1 \89ñ\82¾\82¯\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B
+ // \88ø\90\94 tuner \82Í 0 \8aî\92ê\82Ì\83`\83\85\81[\83i\81[\94Ô\8d\86\82Å\82·\81B
+ // PT1\82É\8cÀ\82è PLL \82ð\8f\89\8aú\89»\82·\82é\82½\82ß\82É\81A\93à\95\94\93I\82É SetFrequency(tuner, ISDB_S, 0) \82Æ SetFrequency(tuner, ISDB_T, 63) \82ª
+ // \8eÀ\8ds\82³\82ê\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢
+ // STATUS_POWER_RESET_ERROR \81¨ SetTunerPowerReset() \82Å TUNER_POWER_ON_RESET_DISABLE \88È\8aO\82ª\8ew\92è\82³\82ê\82Ä\82¢\82é
+ // STATUS_I2C_ERROR \81¨ \95\9c\92²IC \82©\82ç\83\8a\81[\83h\82µ\82½\83\8c\83W\83X\83^\92l\82ª\88Ù\8fí
+ virtual status InitTuner(uint tuner) = 0;
+
+ // \8eó\90M\95û\8e®
+ enum ISDB {
+ ISDB_S,
+ ISDB_T,
+
+ ISDB_COUNT
+ };
+
+ // [\8b@\94\] \83`\83\85\81[\83i\81[\8fÈ\93d\97Í\90§\8cä
+ // [\90à\96¾] \83`\83\85\81[\83i\81[\8f\89\8aú\8cã\82Í\8fÈ\93d\97Í\83I\83\93\82É\82È\82Á\82Ä\82¢\82Ü\82·\82Ì\82Å\81A\8eó\90M\91O\82É\8fÈ\93d\97Í\82ð\83I\83t\82É\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+ // (PT1) \95\9c\92²IC \82Ì\82Ý\82ª\91Î\8fÛ\82Å\82·\81B\83`\83\85\81[\83i\81[\83\86\83j\83b\83g\93à\82Ì\91¼\82Ì\89ñ\98H\82Í SetTunerPowerReset(TUNER_POWER_OFF) \82Æ\82µ\82È\82¢\8cÀ\82è\81A
+ // \93d\97Í\82ð\8fÁ\94ï\82µ\91±\82¯\82Ü\82·\81B\95\9c\92²IC \82Ì\8fÁ\94ï\93d\97Í\82Í\83`\83\85\81[\83i\81[\83\82\83W\83\85\81[\83\8b\82Ì 15% \82Å\82·\81B
+ // (PT2) RF\83t\83\8d\83\93\83g\83G\83\93\83h\89ñ\98H\91S\91Ì\82Æ\95\9c\92²IC \82ª\91Î\8fÛ\82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 sleep \82ª NULL (GetTunerSleep \82Ì\82Ý)
+ virtual status SetTunerSleep(uint tuner, ISDB isdb, bool sleep) = 0;
+ virtual status GetTunerSleep(uint tuner, ISDB isdb, bool *sleep) const = 0;
+
+ // ----------
+ // \8bÇ\94\8eü\94g\90\94
+ // ----------
+
+ // [\8b@\94\] \8bÇ\94\8eü\94g\90\94\82Ì\90§\8cä
+ // [\90à\96¾] offset \82Å\8eü\94g\90\94\82Ì\92²\90®\82ª\89Â\94\\82Å\82·\81B\92P\88Ê\82Í ISDB-S \82Ì\8fê\8d\87\82Í 1MHz\81AISDB-T \82Ì\8fê\8d\87\82Í 1/7MHz \82Å\82·\81B
+ // \97á\82¦\82Î\81AC24 \82ð\95W\8f\80\82æ\82è 2MHz \8d\82\82¢\8eü\94g\90\94\82É\90Ý\92è\82·\82é\82É\82Í SetFrequency(tuner, ISDB_T, 23, 7*2) \82Æ\82µ\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 channel \82ª NULL (GetFrequency \82Ì\82Ý)
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô\82Ì\82½\82ß\90Ý\92è\95s\89Â (SetFrequency \82Ì\82Ý)
+ virtual status SetFrequency(uint tuner, ISDB isdb, uint channel, int offset = 0) = 0;
+ virtual status GetFrequency(uint tuner, ISDB isdb, uint *channel, int *offset = 0) const = 0;
+
+ // (ISDB-S)
+ // PLL \8eü\94g\90\94\83X\83e\83b\83v\82ª 1MHz \82Ì\82½\82ß\81A\8eÀ\8dÛ\82É\90Ý\92è\82³\82ê\82é\8eü\94g\90\94\82Í f' \82É\82È\82è\82Ü\82·\81B
+ // +----+------+---------+---------+ +----+------+---------+---------+ +----+------+---------+---------+
+ // | ch | TP # | f (MHz) | f'(MHz) | | ch | TP # | f (MHz) | f'(MHz) | | ch | TP # | f (MHz) | f'(MHz) |
+ // +----+------+---------+---------+ +----+------+---------+---------+ +----+------+---------+---------+
+ // | 0 | BS 1 | 1049.48 | 1049.00 | | 12 | ND 2 | 1613.00 | (\93¯\8d¶) | | 24 | ND 1 | 1593.00 | (\93¯\8d¶) |
+ // | 1 | BS 3 | 1087.84 | 1088.00 | | 13 | ND 4 | 1653.00 | (\93¯\8d¶) | | 25 | ND 3 | 1633.00 | (\93¯\8d¶) |
+ // | 2 | BS 5 | 1126.20 | 1126.00 | | 14 | ND 6 | 1693.00 | (\93¯\8d¶) | | 26 | ND 5 | 1673.00 | (\93¯\8d¶) |
+ // | 3 | BS 7 | 1164.56 | 1165.00 | | 15 | ND 8 | 1733.00 | (\93¯\8d¶) | | 27 | ND 7 | 1713.00 | (\93¯\8d¶) |
+ // | 4 | BS 9 | 1202.92 | 1203.00 | | 16 | ND10 | 1773.00 | (\93¯\8d¶) | | 28 | ND 9 | 1753.00 | (\93¯\8d¶) |
+ // | 5 | BS11 | 1241.28 | 1241.00 | | 17 | ND12 | 1813.00 | (\93¯\8d¶) | | 29 | ND11 | 1793.00 | (\93¯\8d¶) |
+ // | 6 | BS13 | 1279.64 | 1280.00 | | 18 | ND14 | 1853.00 | (\93¯\8d¶) | | 30 | ND13 | 1833.00 | (\93¯\8d¶) |
+ // | 7 | BS15 | 1318.00 | (\93¯\8d¶) | | 19 | ND16 | 1893.00 | (\93¯\8d¶) | | 31 | ND15 | 1873.00 | (\93¯\8d¶) |
+ // | 8 | BS17 | 1356.36 | 1356.00 | | 20 | ND18 | 1933.00 | (\93¯\8d¶) | | 32 | ND17 | 1913.00 | (\93¯\8d¶) |
+ // | 9 | BS19 | 1394.72 | 1395.00 | | 21 | ND20 | 1973.00 | (\93¯\8d¶) | | 33 | ND19 | 1953.00 | (\93¯\8d¶) |
+ // | 10 | BS21 | 1433.08 | 1433.00 | | 22 | ND22 | 2013.00 | (\93¯\8d¶) | | 34 | ND21 | 1993.00 | (\93¯\8d¶) |
+ // | 11 | BS23 | 1471.44 | 1471.00 | | 23 | ND24 | 2053.00 | (\93¯\8d¶) | | 35 | ND23 | 2033.00 | (\93¯\8d¶) |
+ // +----+------+---------+---------+ +----+------+---------+---------+ +----+------+---------+---------+
+ //
+ // (ISDB-T)
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ // | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) |
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ // | 0 | 1 | 93+1/7 | | 23 | C24 | 231+1/7 | | 46 | C47 | 369+1/7 | | 69 | 19 | 509+1/7 | | 92 | 42 | 647+1/7 |
+ // | 1 | 2 | 99+1/7 | | 24 | C25 | 237+1/7 | | 47 | C48 | 375+1/7 | | 70 | 20 | 515+1/7 | | 93 | 43 | 653+1/7 |
+ // | 2 | 3 | 105+1/7 | | 25 | C26 | 243+1/7 | | 48 | C49 | 381+1/7 | | 71 | 21 | 521+1/7 | | 94 | 44 | 659+1/7 |
+ // | 3 | C13 | 111+1/7 | | 26 | C27 | 249+1/7 | | 49 | C50 | 387+1/7 | | 72 | 22 | 527+1/7 | | 95 | 45 | 665+1/7 |
+ // | 4 | C14 | 117+1/7 | | 27 | C28 | 255+1/7 | | 50 | C51 | 393+1/7 | | 73 | 23 | 533+1/7 | | 96 | 46 | 671+1/7 |
+ // | 5 | C15 | 123+1/7 | | 28 | C29 | 261+1/7 | | 51 | C52 | 399+1/7 | | 74 | 24 | 539+1/7 | | 97 | 47 | 677+1/7 |
+ // | 6 | C16 | 129+1/7 | | 29 | C30 | 267+1/7 | | 52 | C53 | 405+1/7 | | 75 | 25 | 545+1/7 | | 98 | 48 | 683+1/7 |
+ // | 7 | C17 | 135+1/7 | | 30 | C31 | 273+1/7 | | 53 | C54 | 411+1/7 | | 76 | 26 | 551+1/7 | | 99 | 49 | 689+1/7 |
+ // | 8 | C18 | 141+1/7 | | 31 | C32 | 279+1/7 | | 54 | C55 | 417+1/7 | | 77 | 27 | 557+1/7 | | 100 | 50 | 695+1/7 |
+ // | 9 | C19 | 147+1/7 | | 32 | C33 | 285+1/7 | | 55 | C56 | 423+1/7 | | 78 | 28 | 563+1/7 | | 101 | 51 | 701+1/7 |
+ // | 10 | C20 | 153+1/7 | | 33 | C34 | 291+1/7 | | 56 | C57 | 429+1/7 | | 79 | 29 | 569+1/7 | | 102 | 52 | 707+1/7 |
+ // | 11 | C21 | 159+1/7 | | 34 | C35 | 297+1/7 | | 57 | C58 | 435+1/7 | | 80 | 30 | 575+1/7 | | 103 | 53 | 713+1/7 |
+ // | 12 | C22 | 167+1/7 | | 35 | C36 | 303+1/7 | | 58 | C59 | 441+1/7 | | 81 | 31 | 581+1/7 | | 104 | 54 | 719+1/7 |
+ // | 13 | 4 | 173+1/7 | | 36 | C37 | 309+1/7 | | 59 | C60 | 447+1/7 | | 82 | 32 | 587+1/7 | | 105 | 55 | 725+1/7 |
+ // | 14 | 5 | 179+1/7 | | 37 | C38 | 315+1/7 | | 60 | C61 | 453+1/7 | | 83 | 33 | 593+1/7 | | 106 | 56 | 731+1/7 |
+ // | 15 | 6 | 185+1/7 | | 38 | C39 | 321+1/7 | | 61 | C62 | 459+1/7 | | 84 | 34 | 599+1/7 | | 107 | 57 | 737+1/7 |
+ // | 16 | 7 | 191+1/7 | | 39 | C40 | 327+1/7 | | 62 | C63 | 465+1/7 | | 85 | 35 | 605+1/7 | | 108 | 58 | 743+1/7 |
+ // | 17 | 8 | 195+1/7 | | 40 | C41 | 333+1/7 | | 63 | 13 | 473+1/7 | | 86 | 36 | 611+1/7 | | 109 | 59 | 749+1/7 |
+ // | 18 | 9 | 201+1/7 | | 41 | C42 | 339+1/7 | | 64 | 14 | 479+1/7 | | 87 | 37 | 617+1/7 | | 110 | 60 | 755+1/7 |
+ // | 19 | 10 | 207+1/7 | | 42 | C43 | 345+1/7 | | 65 | 15 | 485+1/7 | | 88 | 38 | 623+1/7 | | 111 | 61 | 761+1/7 |
+ // | 20 | 11 | 213+1/7 | | 43 | C44 | 351+1/7 | | 66 | 16 | 491+1/7 | | 89 | 39 | 629+1/7 | | 112 | 62 | 767+1/7 |
+ // | 21 | 12 | 219+1/7 | | 44 | C45 | 357+1/7 | | 67 | 17 | 497+1/7 | | 90 | 40 | 635+1/7 | +-----+-----+---------+
+ // | 22 | C23 | 225+1/7 | | 45 | C46 | 363+1/7 | | 68 | 18 | 503+1/7 | | 91 | 41 | 641+1/7 |
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ //
+ // C24\81`C27 \82Í\81A\83P\81[\83u\83\8b\83e\83\8c\83r\8bÇ\82É\82æ\82è\89º\8bL\82Ì\8eü\94g\90\94\82Å\91\97\90M\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+ // +-----+---------+
+ // | Ch. | f (MHz) |
+ // +-----+---------+
+ // | C24 | 233+1/7 |
+ // | C25 | 239+1/7 |
+ // | C26 | 245+1/7 |
+ // | C27 | 251+1/7 |
+ // +-----+---------+
+
+ // ----------
+ // \8eü\94g\90\94\8cë\8d·
+ // ----------
+
+ // [\8b@\94\] \8eü\94g\90\94\8cë\8d·\82ð\8eæ\93¾
+ // [\90à\96¾] \92l\82Ì\88Ó\96¡\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // \83N\83\8d\83b\83N\8eü\94g\90\94\8cë\8d·: clock/100 (ppm)
+ // \83L\83\83\83\8a\83A\8eü\94g\90\94\8cë\8d·: carrier (Hz)
+ // \95ú\91\97\94g\82Ì\8eü\94g\90\94\90¸\93x\82Í\8f\\95ª\82É\8d\82\82¢\89¼\92è\82·\82é\82Æ\81A\8cë\8d·\82ª\94\90¶\82·\82é\97v\91f\82Æ\82µ\82Ä\88È\89º\82Ì\82æ\82¤\82È\82à\82Ì\82ª\8dl\82¦\82ç\82ê\82Ü\82·\81B
+ // (ISDB-S) LNB \82Å\82Ì\8eü\94g\90\94\95Ï\8a·\90¸\93x / \89q\90¯\91¤ PLL-IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x / \95\9c\92² IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x
+ // (ISDB-T) \92n\8fã\91¤ PLL-IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x / \95\9c\92² IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 clock, carrier \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô
+ virtual status GetFrequencyOffset(uint tuner, ISDB isdb, int *clock, int *carrier) = 0;
+
+ // --------
+ // C/N\81EAGC
+ // --------
+
+ // [\8b@\94\] C/N \82Æ AGC \82ð\8eæ\93¾
+ // [\90à\96¾] C/N \82Í\92á\83\8c\83C\83e\83\93\83V\82Å\91ª\92è\82Å\82«\82é\82½\82ß\81A\83A\83\93\83e\83i\82Ì\8cü\82«\82ð\92²\90®\82·\82é\82Ì\82É\95Ö\97\98\82Å\82·\81B
+ // \92l\82Ì\88Ó\96¡\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // C/N : cn100/100 (dB)
+ // \8c»\8dÝ\82Ì AGC \92l : currentAgc
+ // \97\98\93¾\8dÅ\91å\8e\9e\82Ì AGC \92l: maxAgc
+ // currentAgc \82Ì\94Í\88Í\82Í 0 \82©\82ç maxAgc \82Ü\82Å\82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 cn100, currentAgc, maxAgc \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô
+ virtual status GetCnAgc(uint tuner, ISDB isdb, uint *cn100, uint *currentAgc, uint *maxAgc) = 0;
+
+ // -------------------
+ // TS-ID (ISDB-S \82Ì\82Ý)
+ // -------------------
+
+ // [\8b@\94\] TS-ID \82ð\90Ý\92è
+ // [\90à\96¾] \90Ý\92è\92l\82ª\95\9c\92²IC \82Ì\93®\8dì\82É\94½\89f\82³\82ê\82é\82Ü\82Å\8e\9e\8aÔ\82ª\8a|\82©\82è\82Ü\82·\81B
+ // GetLayerS() \82ð\8cÄ\82Ñ\8fo\82·\91O\82É\81AGetIdS() \82ð\8eg\82Á\82Ä\90Ø\82è\91Ö\82¦\82ª\8a®\97¹\82µ\82½\82±\82Æ\82ð\8am\94F\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢
+ virtual status SetIdS(uint tuner, uint id) = 0;
+
+ // [\8b@\94\] \8c»\8dÝ\8f\88\97\9d\92\86\82Ì TS-ID \82ð\8eæ\93¾
+ // [\90à\96¾] GetLayerS() \82Å\8eæ\93¾\82Å\82«\82é\83\8c\83C\83\84\8fî\95ñ\82Í\81A\82±\82Ì\8aÖ\90\94\82Å\8e¦\82³\82ê\82é TS-ID \82Ì\82à\82Ì\82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\81B\82Ü\82½\82Í\88ø\90\94 id \82ª NULL
+ virtual status GetIdS(uint tuner, uint *id) = 0;
+
+ // ------------
+ // \83G\83\89\81[\83\8c\81[\83g
+ // ------------
+
+ // \8aK\91w\83C\83\93\83f\83b\83N\83X
+ enum LayerIndex {
+ // ISDB-S
+ LAYER_INDEX_L = 0, // \92á\8aK\91w
+ LAYER_INDEX_H, // \8d\82\8aK\91w
+
+ // ISDB-T
+ LAYER_INDEX_A = 0, // A \8aK\91w
+ LAYER_INDEX_B, // B \8aK\91w
+ LAYER_INDEX_C // C \8aK\91w
+ };
+
+ // \8aK\91w\90\94
+ enum LayerCount {
+ // ISDB-S
+ LAYER_COUNT_S = LAYER_INDEX_H + 1,
+
+ // ISDB-T
+ LAYER_COUNT_T = LAYER_INDEX_C + 1
+ };
+
+ // \83G\83\89\81[\83\8c\81[\83g
+ struct ErrorRate {
+ uint Numerator, Denominator;
+ };
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82³\82ê\82½\83G\83\89\81[\83\8c\81[\83g\82ð\8eæ\93¾
+ // [\90à\96¾] \91ª\92è\82É\8e\9e\8aÔ\82ª\8a|\82©\82è\82Ü\82·\82ª\81A\8eó\90M\95i\8e¿\82ð\90³\8am\82É\94c\88¬\82·\82é\82É\82Í C/N \82Å\82Í\82È\82\82±\82Ì\83G\83\89\81[\83\8c\81[\83g\82ð\8eQ\8dl\82É\82µ\82Ä\82\82¾\82³\82¢\81B
+ // \82Ð\82Æ\82Â\82Ì\96Ú\88À\82Æ\82µ\82Ä 2\81~10^-4 \88È\89º\82Å\82 \82ê\82Î\81A\83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\8cã\82É\82Ù\82Ú\83G\83\89\81[\83t\83\8a\81[\82É\82È\82é\82Æ\82¢\82í\82ê\82Ä\82¢\82Ü\82·\81B
+ // \83G\83\89\81[\83\8c\81[\83g\82Ì\8fW\8cv\92P\88Ê\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // ISDB-S: 1024 \83t\83\8c\81[\83\80
+ // ISDB-T: 32 \83t\83\8c\81[\83\80 (\83\82\81[\83h 1,2) / 8 \83t\83\8c\81[\83\80 (\83\82\81[\83h 3)
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner, isdb, layerIndex \82ª\94Í\88Í\8aO\81B\82Ü\82½\82Í errorRate \82ª NULL
+ virtual status GetCorrectedErrorRate(uint tuner, ISDB isdb, LayerIndex layerIndex, ErrorRate *errorRate) = 0;
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82³\82ê\82½\83G\83\89\81[\83\8c\81[\83g\82ð\8cv\8eZ\82·\82é\82½\82ß\82Ì\83G\83\89\81[\83J\83E\83\93\83^\82ð\8f\89\8aú\89»
+ // [\90à\96¾] \91S\8aK\91w\82Ì\83J\83E\83\93\83^\82ð\8f\89\8aú\89»\82µ\82Ü\82·\81B\93Á\92è\82Ì\8aK\91w\82Ì\83J\83E\83\93\83^\82ð\83\8a\83Z\83b\83g\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ virtual status ResetCorrectedErrorCount(uint tuner, ISDB isdb) = 0;
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82µ\82«\82ê\82È\82©\82Á\82½ TS \83p\83P\83b\83g\90\94\82ð\8eæ\93¾
+ // [\90à\96¾] \89º\88Ê24\83r\83b\83g\82Ì\82Ý\97L\8cø\82Å\82·\81i\89ñ\98H\8bK\96Í\82ð\8f¬\82³\82\82·\82é\82½\82ß\89ñ\98H\94Ô\8d\8601 \82É\82Ä\83r\83b\83g\90\94\82ð\8fk\8f¬\81j\81B
+ // 0x??ffffff \82Ì\8e\9f\82Í 0x??000000 \82É\82È\82è\82Ü\82·\81B
+ // TS \83p\83P\83b\83g\82Ì 2nd Byte MSB \82ð\90\94\82¦\82Ä\82à\93¯\82¶\90\94\92l\82É\82È\82è\82Ü\82·\81B
+ // \82±\82Ì\83J\83E\83\93\83^\82Í DMA \93]\91\97\8aJ\8en\8e\9e\82É\8f\89\8aú\89»\82³\82ê\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO\81B\82Ü\82½\82Í\88ø\90\94 count \82ª NULL
+ virtual status GetErrorCount(uint tuner, ISDB isdb, uint *count) = 0;
+
+ // --------------------------
+ // TMCC\81E\83\8c\83C\83\84\81[\81E\83\8d\83b\83N\94»\92è
+ // --------------------------
+
+ // ISDB-S TMCC \8fî\95ñ
+ // (\8eQ\8dl) STD-B20 2.9 TMCC\8fî\95ñ\82Ì\8d\\90¬ \81` 2.11 TMCC\8fî\95ñ\82Ì\8dX\90V
+ struct TmccS {
+ uint Indicator; // \95Ï\8dX\8ew\8e¦ (5\83r\83b\83g)
+ uint Mode[4]; // \93`\91\97\83\82\81[\83hn (4\83r\83b\83g)
+ uint Slot[4]; // \93`\91\97\83\82\81[\83hn\82Ö\82Ì\8a\84\93\96\83X\83\8d\83b\83g\90\94 (6\83r\83b\83g)
+ // [\91\8a\91ÎTS\81^\83X\83\8d\83b\83g\8fî\95ñ\82Í\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ]
+ uint Id[8]; // \91\8a\91ÎTS\94Ô\8d\86n\82É\91Î\82·\82éTS ID (16\83r\83b\83g)
+ uint Emergency; // \8bN\93®\90§\8cä\90M\8d\86 (1\83r\83b\83g)
+ uint UpLink; // \83A\83b\83v\83\8a\83\93\83N\90§\8cä\8fî\95ñ (4\83r\83b\83g)
+ uint ExtFlag; // \8ag\92£\83t\83\89\83O (1\83r\83b\83g)
+ uint ExtData[2]; // \8ag\92£\97Ì\88æ (61\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-S \82Ì TMCC \8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 tmcc \82ª NULL
+ virtual status GetTmccS(uint tuner, TmccS *tmcc) = 0;
+
+ // ISDB-S \8aK\91w\8fî\95ñ
+ struct LayerS {
+ uint Mode [LAYER_COUNT_S]; // \93`\91\97\83\82\81[\83h (3\83r\83b\83g)
+ uint Count[LAYER_COUNT_S]; // \83_\83~\81[\83X\83\8d\83b\83g\82ð\8aÜ\82ß\82½\8a\84\93\96\83X\83\8d\83b\83g\90\94 (6\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-S \82Ì\83\8c\83C\83\84\8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 layerS \82ª NULL
+ virtual status GetLayerS(uint tuner, LayerS *layerS) = 0;
+
+ // ISDB-T TMCC \8fî\95ñ
+ // (\8eQ\8dl) STD-B31 3.15.6 TMCC\8fî\95ñ \81` 3.15.6.8 \83Z\83O\83\81\83\93\83g\90\94
+ struct TmccT {
+ uint System; // \83V\83X\83e\83\80\8e¯\95Ê (2\83r\83b\83g)
+ uint Indicator; // \93`\91\97\83p\83\89\83\81\81[\83^\90Ø\82è\91Ö\82¦\8ew\95W (4\83r\83b\83g)
+ uint Emergency; // \8bÙ\8b}\8cx\95ñ\95ú\91\97\97p\8bN\93®\83t\83\89\83O (1\83r\83b\83g)
+ // \83J\83\8c\83\93\83g\8fî\95ñ
+ uint Partial; // \95\94\95ª\8eó\90M\83t\83\89\83O (1\83r\83b\83g)
+ // \8aK\91w\8fî\95ñ
+ uint Mode [LAYER_COUNT_T]; // \83L\83\83\83\8a\83A\95Ï\92²\95û\8e® (3\83r\83b\83g)
+ uint Rate [LAYER_COUNT_T]; // \8fô\8d\9e\82Ý\95\84\8d\86\89»\97¦ (3\83r\83b\83g)
+ uint Interleave[LAYER_COUNT_T]; // \83C\83\93\83^\81[\83\8a\81[\83u\92· (3\83r\83b\83g)
+ uint Segment [LAYER_COUNT_T]; // \83Z\83O\83\81\83\93\83g\90\94 (4\83r\83b\83g)
+ // [\83l\83N\83X\83g\8fî\95ñ\82Í\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ]
+ uint Phase; // \98A\8c\8b\91\97\90M\88Ê\91\8a\95â\90³\97Ê (3\83r\83b\83g)
+ uint Reserved; // \83\8a\83U\81[\83u (12\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-T \82Ì TMCC \8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 tmcc \82ª NULL
+ virtual status GetTmccT(uint tuner, TmccT *tmcc) = 0;
+
+ // [\8b@\94\] ISDB-T \83\8d\83b\83N\94»\92è\82ð\8eæ\93¾
+ // [\90à\96¾] \83\8c\83C\83\84\82ª\91¶\8dÝ\82µ\81A\82È\82¨\82©\82Â\82»\82Ì\83\8c\83C\83\84\82ª\83G\83\89\81[\83t\83\8a\81[\82Å\82 \82é\82Æ\82«\82É true \82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 locked \82ª NULL
+ virtual status GetLockedT(uint tuner, bool locked[LAYER_COUNT_T]) = 0;
+
+ // \8eó\90M\8aK\91w
+ enum LayerMask {
+ LAYER_MASK_NONE,
+
+ // ISDB-S
+ LAYER_MASK_L = 1 << LAYER_INDEX_L,
+ LAYER_MASK_H = 1 << LAYER_INDEX_H,
+
+ // ISDB-T
+ LAYER_MASK_A = 1 << LAYER_INDEX_A,
+ LAYER_MASK_B = 1 << LAYER_INDEX_B,
+ LAYER_MASK_C = 1 << LAYER_INDEX_C
+ };
+
+ // [\8b@\94\] \8eó\90M\8aK\91w\82Ì\90Ý\92è
+ // [\90à\96¾] ISDB-S \82Ì\92á\8aK\91w\82ð\8eó\90M\82µ\82È\82¢\82æ\82¤\82É\90Ý\92è\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 layerMask \82ª\94Í\88Í\8aO (SetLayerEnable \82Ì\82Ý)
+ // \88ø\90\94 layerMask \82ª NULL (GetLayerEnable \82Ì\82Ý)
+ virtual status SetLayerEnable(uint tuner, ISDB isdb, LayerMask layerMask) = 0;
+ virtual status GetLayerEnable(uint tuner, ISDB isdb, LayerMask *layerMask) const = 0;
+
+ // --------
+ // DMA \93]\91\97
+ // --------
+
+ // \83o\83b\83t\83@\83T\83C\83Y
+ enum {
+ BUFFER_PAGE_COUNT = 511
+ };
+
+ // \83o\83b\83t\83@\8fî\95ñ
+ struct BufferInfo {
+ uint VirtualSize;
+ uint VirtualCount;
+ uint LockSize;
+ };
+ // \83o\83b\83t\83@\82Í\83h\83\89\83C\83o\93à\95\94\82Å VirtualAlloc(4096*BUFFER_PAGE_COUNT*VirtualSize) \82ð VirtualCount \89ñ\8cÄ\82Ñ\8fo\82·\82±\82Æ\82É\82æ\82è\8am\95Û\82³\82ê\82Ü\82·\81B
+ // VirtualCount \82ª 2 \88È\8fã\82Ì\8fê\8d\87\82Í\83o\83b\83t\83@\82ª\95ª\8a\84\82³\82ê\82é\82½\82ß\81A\83A\83h\83\8c\83X\82ª\95s\98A\91±\82É\82È\82é\82±\82Æ\82É\82²\92\8d\88Ó\82\82¾\82³\82¢\81B
+ // LockSize \82Í\83h\83\89\83C\83o\93à\95\94\82Å\83\81\83\82\83\8a\82ð\83\8d\83b\83N\82·\82é\92P\88Ê\82Å\82·\81B
+ //
+ // VirtualSize \82Ì\94Í\88Í\82Í 0 \88È\8aO\82Ì\94C\88Ó\82Ì\90\94\92l\82Å\82·\81B
+ // (VirtualSize * VirtualCount) \82Í\93]\91\97\83J\83E\83\93\83^\82Ì\83r\83b\83g\92·\82É\82æ\82é\90§\8cÀ\82ð\8eó\82¯\82é\82½\82ß\81A\94Í\88Í\82Í 1\81`4095 \82Å\82·\81B
+ // (VirtualSize % LockSize) \82Í 0 \82Å\82È\82¯\82ê\82Î\82È\82è\82Ü\82¹\82ñ\81B
+ //
+ // DMA \83o\83b\83t\83@\82Í CPU \91¤\82©\82ç\8c©\82Ä\83L\83\83\83b\83V\83\85\8bÖ\8e~\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B\82±\82Ì\82½\82ß\81A\83o\83b\83t\83@\82Ì\93à\97e\82ð\83o\83C\83g\92P\88Ê\82Å\95¡\90\94\89ñ
+ // \93Ç\82Ý\8fo\82·\8fê\8d\87\82È\82Ç\82É\91¬\93x\92á\89º\82ª\94\90¶\82µ\82Ü\82·\81B\82±\82ê\82ð\94ð\82¯\82é\82É\82Í\83f\81[\83^\82ð\83L\83\83\83b\83V\83\85\89Â\94\\82È\83\81\83\82\83\8a\82É\83R\83s\81[\82µ\82Ä\81A
+ // \83R\83s\81[\82³\82ê\82½\83f\81[\83^\82É\83A\83N\83Z\83X\82µ\82Ü\82·\81B
+
+ // [\8b@\94\] DMA \83o\83b\83t\83@\82Ì\8am\95Û\81E\89ð\95ú
+ // [\90à\96¾] DMA \83o\83b\83t\83@\82ð\8aJ\95ú\82·\82é\82É\82Í SetBufferInfo(NULL) \82Æ\82µ\82Ü\82·\81B
+ // \83o\83b\83t\83@\82ª\8am\95Û\82³\82ê\82Ä\82¢\82È\82¢\82Æ\82«\82É GetBufferInfo() \82ð\8cÄ\82Ñ\8fo\82·\82Æ\81AbufferInfo \82ª\8ew\82·\91S\82Ä\82Ì\83\81\83\93\83o\82Í 0 \82É\82È\82è\82Ü\82·\81B
+ // \83o\83b\83t\83@\82Ì\8d\\90¬\82ð\95Ï\8dX\82·\82é\8fê\8d\87\82Í\81A\8c»\8dÝ\82Ì\83o\83b\83t\83@\82ð\89ð\95ú\82µ\82Ä\82©\82ç\89ü\82ß\82Ä\8am\95Û\82µ\82Ü\82·\81B
+ virtual status SetBufferInfo(const BufferInfo *bufferInfo) = 0;
+ virtual status GetBufferInfo( BufferInfo *bufferInfo) const = 0;
+
+ // [\8b@\94\] DMA \83o\83b\83t\83@\82Ì\83|\83C\83\93\83^\82ð\8eæ\93¾
+ // [\90à\96¾] index \82Å\8ew\92è\82µ\82½ DMA \83o\83b\83t\83@\82Ì\83|\83C\83\93\83^\82ð\8eæ\93¾\82µ\82Ü\82·\81Bindex \82Ì\94Í\88Í\82Í 0 \82©\82ç BufferInfo::VirtualCount-1 \82Å\82·\81B
+ virtual status GetBufferPtr(uint index, void **ptr) const = 0;
+
+ // [\8b@\94\] \93]\91\97\83J\83E\83\93\83^\82ð\83\8a\83Z\83b\83g\81E\83C\83\93\83N\83\8a\83\81\83\93\83g
+ // [\90à\96¾] FPGA \89ñ\98H\82Í\8e\9f\82Ì\82æ\82¤\82É\93®\8dì\82µ\82Ü\82·\81B
+ // while (true) {
+ // /* \93]\91\97\83J\83E\83\93\83^\82ð\83`\83F\83b\83N */
+ // if (\93]\91\97\83J\83E\83\93\83^ == 0) {
+ // TransferInfo::TransferCounter0 = true;
+ // break;
+ // }
+ // if (\93]\91\97\83J\83E\83\93\83^ <= 1) {
+ // TransferInfo::TransferCounter1 = true;
+ // /* \82±\82±\82Å\82Í break \82µ\82È\82¢ */
+ // }
+ //
+ // /* \93]\91\97\83J\83E\83\93\83^\82ð\83f\83N\83\8a\83\81\83\93\83g */
+ // \93]\91\97\83J\83E\83\93\83^--;
+ //
+ // /* \83f\81[\83^\93]\91\97 */
+ // for (uint i=0; i<BUFFER_PAGE_COUNT; i++) {
+ // /* 4096+64 \83o\83C\83g\82Ì\83f\81[\83^\82ª\97\82Ü\82é\82Ü\82Å\91Ò\82Â */
+ // while (true) {
+ // if (4096+64 <= \83o\83b\83t\83@\8fã\82Ì\83f\81[\83^\83o\83C\83g\90\94) {
+ // break;
+ // }
+ // }
+ // /* 4096 \83o\83C\83g\82Ì\83f\81[\83^\82ð\93]\91\97 */
+ // Transfer();
+ // }
+ // }
+ // \83z\83X\83g\91¤\82©\82ç\82Í\81A4096*BUFFER_PAGE_COUNT \83o\83C\83g\92P\88Ê\82Å\93]\91\97\83J\83E\83\93\83^\82ð\83C\83\93\83N\83\8a\83\81\83\93\83g\82·\82é\82±\82Æ\82É\82È\82è\82Ü\82·\81B
+ // \93]\91\97\83J\83E\83\93\83^\92·\82Í 12 \83r\83b\83g\82Å\82·\81B
+ virtual status ResetTransferCounter() = 0;
+ virtual status IncrementTransferCounter() = 0;
+
+ // [\8b@\94\] \83X\83g\83\8a\81[\83\80\82²\82Æ\82Ì\93]\91\97\90§\8cä
+ // [\90à\96¾] \8ae\83X\83g\83\8a\81[\83\80\82ð\93]\91\97\82·\82é\82©\82Ç\82¤\82©\82ð\90Ý\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+ // \95K\97v\82Ì\82È\82¢\83X\83g\83\8a\81[\83\80\82ð\83I\83t\82É\82·\82é\82±\82Æ\82Å PCI \83o\83X\82Ì\91Ñ\88æ\82ð\96³\91Ê\82É\8eg\82¤\82±\82Æ\82ª\82È\82\82È\82è\82Ü\82·\81B
+ // DMA \93]\91\97\93®\8dì\92\86\82É\82à\95Ï\8dX\89Â\94\\82Å\82·\81B
+ virtual status SetStreamEnable(uint tuner, ISDB isdb, bool enable) = 0;
+ virtual status GetStreamEnable(uint tuner, ISDB isdb, bool *enable) const = 0;
+
+ // [\8b@\94\] \83X\83g\83\8a\81[\83\80\82²\82Æ\82Ì 3 \83r\83b\83g\95â\8f\95\83f\81[\83^\82Ì\90Ý\92è
+ // [\90à\96¾] 1 TS \83p\83P\83b\83g(188\83o\83C\83g) \82Í 63 \83}\83C\83N\83\8d\83p\83P\83b\83g\82ð\8eg\82Á\82Ä\93]\91\97\82³\82ê\82Ü\82·\82ª\81A
+ // 3\83o\83C\83g\81~63\83}\83C\83N\83\8d\83p\83P\83b\83g=189\83o\83C\83g\82Æ\82È\82è\81A\96\96\94ö\82Ì\83}\83C\83N\83\8d\83p\83P\83b\83g\82É\82Í\96¢\8eg\97p\95\94\95ª\82ª 1 \83o\83C\83g\82 \82è\82Ü\82·\81B
+ // \82±\82Ì\83o\83C\83g\82Ì\89º\88Ê 3 \83r\83b\83g\82ð\83\86\81[\83U\81[\82ª\8e©\97R\82É\90Ý\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+ // \95\9c\92²IC \82©\82ç\82Ì\90M\8d\86\82ð FPGA \93à\82É\83f\81[\83^\82ð\8eæ\82è\8d\9e\82ñ\82Å\82©\82ç\82Å\82«\82é\82¾\82¯\91\81\82¢\8e\9e\8d\8f\82É 3 \83r\83b\83g\82Ì\83f\81[\83^\82ª
+ // \95t\89Á\82³\82ê\82Ü\82·\82Ì\82Å\81A\83^\83C\83\80\83X\83^\83\93\83v\91ã\82í\82è\82É\97\98\97p\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+ // FPGA \93à\82Å\82Í\92l\82Ì\8f\91\82«\8d\9e\82Ý\82Í PCI \83N\83\8d\83b\83N\82É\93¯\8aú\82µ\81A\92l\82Ì\93Ç\82Ý\8fo\82µ\82Í TS \83N\83\8d\83b\83N\82É\93¯\8aú\82µ\82Ä\82¢\82Ü\82·\81B
+ // \82±\82Ì\82½\82ß\81A\90Ý\92è\82·\82é\90\94\97ñ\82Í\83O\83\8c\83C\83R\81[\83h\82È\82Ç\82Ì\83n\83~\83\93\83O\8b\97\97£\82ª 1 \82Ì\82à\82Ì\82ð\8eg\82Á\82Ä\82\82¾\82³\82¢\81B
+ virtual status SetStreamGray(uint tuner, ISDB isdb, uint gray) = 0;
+ virtual status GetStreamGray(uint tuner, ISDB isdb, uint *gray) const = 0;
+
+ // [\8b@\94\] DMA \8aJ\8en\81E\92â\8e~\82Ì\90§\8cä
+ // [\90à\96¾] DMA \93]\91\97\82Í\91S\82 CPU \82ð\89î\8dÝ\82·\82é\82±\82Æ\82È\82\93®\8dì\82µ\82Ü\82·\81B
+ // GetTransferEnable() \82Å true \82ª\93¾\82ç\82ê\82é\82Æ\82«\82É SetTransferEnable(true ) \82Æ\82µ\82½\82è\81A
+ // GetTransferEnable() \82Å false \82ª\93¾\82ç\82ê\82é\82Æ\82«\82É SetTransferEnable(false) \82Æ\82·\82é\82Æ\83G\83\89\81[\82É\82È\82è\82Ü\82·\81B
+ //
+ // GetTransferEnable() \82Å\8eæ\93¾\82Å\82«\82é\92l\82Í\81A\92P\82É SetTransferEnable() \82Å\8dÅ\8cã\82É\90Ý\92è\82³\82ê\82½\92l\82Æ\93¯\82¶\82Å\82·\81B
+ // \93]\91\97\83J\83E\83\93\83^\82ª 0 \82É\82È\82é\82È\82Ç\81A\83n\81[\83h\83E\83F\83A\91¤\82Å DMA \93]\91\97\82ª\8e©\93®\93I\82É\92â\8e~\82·\82é\97v\88ö\82ª\82¢\82\82Â\82©\82 \82è\82Ü\82·\82ª\81A
+ // \82»\82Ì\8fê\8d\87\82Å\82à GetTransferEnable() \82Å\93¾\82ç\82ê\82é\92l\82Í\95Ï\82í\82è\82Ü\82¹\82ñ\81B
+ virtual status SetTransferEnable(bool enable) = 0;
+ virtual status GetTransferEnable(bool *enable) const = 0;
+
+ struct TransferInfo {
+ bool TransferCounter0; // \93]\91\97\83J\83E\83\93\83^\82ª 0 \82Å\82 \82é\82Ì\82ð\8c\9f\8fo\82µ\82½
+ bool TransferCounter1; // \93]\91\97\83J\83E\83\93\83^\82ª 1 \88È\89º\82Å\82 \82é\82Ì\82ð\8c\9f\8fo\82µ\82½
+ bool BufferOverflow; // PCI \83o\83X\82ð\92·\8aú\82É\93n\82è\8am\95Û\82Å\82«\82È\82©\82Á\82½\82½\82ß\81A\83{\81[\83h\8fã\82Ì FIFO(\83T\83C\83Y=8MB) \82ª\88ì\82ê\82½
+ }; // (\82±\82ê\82ç\82Ì\83t\83\89\83O\82Í\81A\88ê\93x\82Å\82à\8fð\8c\8f\90¬\97§\82ð\8c\9f\8fo\82·\82é\82Æ DMA \93]\91\97\82ð\8dÄ\8aJ\82·\82é\82Ü\82Å\83N\83\8a\83A\82³\82ê\82Ü\82¹\82ñ)
+
+ // [\8b@\94\] DMA \8fó\91Ô\82Ì\8eæ\93¾
+ virtual status GetTransferInfo(TransferInfo *) = 0;
+
+ // \83}\83C\83N\83\8d\83p\83P\83b\83g\82Ì\8d\\91¢
+ // +------------+----+----+----+----+----+----+----+----+----+----+----+
+ // | \83r\83b\83g\88Ê\92u | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | .. | 0 |
+ // +------------+----+----+----+----+----+----+----+----+----+----+----+
+ // | \93à\97e | id | counter | st | er | data |
+ // +------------+--------------+--------------+----+----+--------------+
+ // id : \83X\83g\83\8a\81[\83\80ID
+ // counter: \83X\83g\83\8a\81[\83\80\82²\82Æ\82Ì\83J\83E\83\93\83^
+ // st : TS \83p\83P\83b\83g\8aJ\8en\88Ê\92u\83t\83\89\83O
+ // er : \83G\83\89\81[\83t\83\89\83O (TransferCounter0 \82Æ TransferCounter1 \82Æ BufferOverflow \82Ì\98_\97\9d\98a)
+ // data : \83f\81[\83^
+
+ // \83X\83g\83\8a\81[\83\80ID
+ // +----+------------------------+
+ // | id | \90à\96¾ |
+ // +----+------------------------+
+ // | 0 | \8bÖ\8e~ |
+ // | 1 | \83`\83\85\81[\83i\81[\94Ô\8d\860 ISDB-S |
+ // | 2 | \83`\83\85\81[\83i\81[\94Ô\8d\860 ISDB-T |
+ // | 3 | \83`\83\85\81[\83i\81[\94Ô\8d\861 ISDB-S |
+ // | 4 | \83`\83\85\81[\83i\81[\94Ô\8d\861 ISDB-T |
+ // | 5 | \97\\96ñ |
+ // | 6 | \97\\96ñ |
+ // | 7 | \97\\96ñ |
+ // +----+------------------------+
+ // \83X\83g\83\8a\81[\83\80ID \82ª 0 \82É\82È\82é\82±\82Æ\82Í\90â\91Î\82É\82 \82è\82Ü\82¹\82ñ\81B
+ // DMA \93]\91\97\82ª\82Ç\82±\82Ü\82Å\90i\82ñ\82Å\82¢\82é\82Ì\82©\82ð\92²\82×\82é\82É\82Í\81A\93]\91\97\91O\82É \83X\83g\83\8a\81[\83\80ID \82ð 0 \82É\90Ý\92è\82µ\82Ä\81A
+ // \82»\82Ì\89Ó\8f\8a\82ª 0 \88È\8aO\82É\82È\82Á\82½\82©\82Ç\82¤\82©\82ð\92²\82×\82Ü\82·\81B
+ // \8eÀ\97p\8fã\82Í\93]\91\97\91O\82É 4 \83o\83C\83g\82Ì\83}\83C\83N\83\8d\83p\83P\83b\83g\97Ì\88æ\82É 0 \82ð\8f\91\82«\8d\9e\82Ý\81A0 \88È\8aO\82É\82È\82Á\82½\82©\82Ç\82¤\82©\82ð\92²\82×\82é\82±\82Æ\82É\82È\82è\82Ü\82·\81B
+
+ // \83}\83C\83N\83\8d\83p\83P\83b\83g\82©\82ç TS \83p\83P\83b\83g\82ð\8dÄ\8d\\90¬\82·\82é\95û\96@\82É\82Â\82¢\82Ä\82Í\83T\83\93\83v\83\8b\83R\81[\83h\82ð\82²\8eQ\8fÆ\82\82¾\82³\82¢\81B
+ // \8e\9f\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\92¼\8cã\82É 188 \83o\83C\83g\82É\96\9e\82½\82È\82¢\83p\83P\83b\83g\82ª\94\90¶\82·\82é\82±\82Æ\82ª\82 \82è\81A\90Ø\8eÌ\82Ä\8f\88\97\9d\82ª\95K\97v\82Å\82·\81B
+ // \81ESetTunerSleep()
+ // \81ESetFrequency()
+ // \81ESetIdS()
+ // \81ESetLayerEnable()
+ // \81ESetStreamEnable()
+ // \81ESetTransferEnable(true)
+
+ protected:
+ virtual ~Device() {}
+ };
+
+ enum Status {
+ // \83G\83\89\81[\82È\82µ
+ STATUS_OK,
+
+ // \88ê\94Ê\93I\82È\83G\83\89\81[
+ STATUS_GENERAL_ERROR = (1)*0x100,
+ STATUS_NOT_IMPLIMENTED,
+ STATUS_INVALID_PARAM_ERROR,
+ STATUS_OUT_OF_MEMORY_ERROR,
+ STATUS_INTERNAL_ERROR,
+
+ // \83o\83X\83N\83\89\83X\82Ì\83G\83\89\81[
+ STATUS_WDAPI_LOAD_ERROR = (2)*256, // wdapi1002.dll \82ª\83\8d\81[\83h\82Å\82«\82È\82¢
+ STATUS_ALL_DEVICES_MUST_BE_DELETED_ERROR,
+
+ // \83f\83o\83C\83X\83N\83\89\83X\82Ì\83G\83\89\81[
+ STATUS_PCI_BUS_ERROR = (3)*0x100,
+ STATUS_CONFIG_REVISION_ERROR,
+ STATUS_FPGA_VERSION_ERROR,
+ STATUS_PCI_BASE_ADDRESS_ERROR,
+ STATUS_FLASH_MEMORY_ERROR,
+
+ STATUS_DCM_LOCK_TIMEOUT_ERROR,
+ STATUS_DCM_SHIFT_TIMEOUT_ERROR,
+
+ STATUS_POWER_RESET_ERROR,
+ STATUS_I2C_ERROR,
+ STATUS_TUNER_IS_SLEEP_ERROR,
+
+ STATUS_PLL_OUT_OF_RANGE_ERROR,
+ STATUS_PLL_LOCK_TIMEOUT_ERROR,
+
+ STATUS_VIRTUAL_ALLOC_ERROR,
+ STATUS_DMA_ADDRESS_ERROR,
+ STATUS_BUFFER_ALREADY_ALLOCATED_ERROR,
+
+ STATUS_DEVICE_IS_ALREADY_OPEN_ERROR,
+ STATUS_DEVICE_IS_NOT_OPEN_ERROR,
+
+ STATUS_BUFFER_IS_IN_USE_ERROR,
+ STATUS_BUFFER_IS_NOT_ALLOCATED_ERROR,
+
+ STATUS_DEVICE_MUST_BE_CLOSED_ERROR,
+
+ // WinDriver \8aÖ\98A\82Ì\83G\83\89\81[
+ STATUS_WD_DriverName_ERROR = (4)*0x100,
+
+ STATUS_WD_Open_ERROR,
+ STATUS_WD_Close_ERROR,
+
+ STATUS_WD_Version_ERROR,
+ STATUS_WD_License_ERROR,
+
+ STATUS_WD_PciScanCards_ERROR,
+
+ STATUS_WD_PciConfigDump_ERROR,
+
+ STATUS_WD_PciGetCardInfo_ERROR,
+ STATUS_WD_PciGetCardInfo_Bus_ERROR,
+ STATUS_WD_PciGetCardInfo_Memory_ERROR,
+
+ STATUS_WD_CardRegister_ERROR,
+ STATUS_WD_CardUnregister_ERROR,
+
+ STATUS_WD_CardCleanupSetup_ERROR,
+
+ STATUS_WD_DMALock_ERROR,
+ STATUS_WD_DMAUnlock_ERROR,
+
+ STATUS_WD_DMASyncCpu_ERROR,
+ STATUS_WD_DMASyncIo_ERROR
+ };
+
+ // ------------------------------
+ // \93Á\8eê\83C\83x\83\93\83g\82É\82¨\82¯\82é\93®\8dì\82Ì\8fÚ\8d×
+ // ------------------------------
+
+ // 1. \83{\81[\83h\82Ì\93d\8c¹\82ª\93\8a\93ü\82³\82ê\82½\82Æ\82«\82Í\81A\83n\81[\83h\83E\83F\83A\82Í\88È\89º\82Ì\8fó\91Ô\82É\82È\82è\82Ü\82·\81B
+ // \81ESetLnbPower(LNB_POWER_OFF)
+ // \81ESetTunerPowerReset(TUNER_POWER_OFF)
+ // \81EDMA \93®\8dì\82Í\92â\8e~
+ // 2. PCI \83\8a\83Z\83b\83g\82ª\83A\83T\81[\83g\82³\82ê\82½\82Æ\82«\82à\81A\93d\8c¹\93\8a\93ü\8e\9e\82Æ\93¯\82¶\8fó\91Ô\82É\82È\82è\82Ü\82·\81B
+ // 3. \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\88Ù\8fí\8fI\97¹\82µ\82½\8fê\8d\87\82ð\8aÜ\82ß\83f\83o\83C\83X\82ð\83N\83\8d\81[\83Y\82·\82é\82Æ\82«\82Í\81A\88È\89º\82Ì\8f\88\97\9d\82ª\8f\87\94Ô\82É\8eÀ\8ds\82³\82ê\82Ü\82·\81B
+ // \81EDMA \93®\8dì\82ð\92â\8e~
+ // \81ESetLnbPower([SetLnbPowerWhenClose() \82Å\8ew\92è\82³\82ê\82½\92l])
+ // \81ESetTunerPowerReset(TUNER_POWER_OFF)
+ // \81EDMA \83o\83b\83t\83@\82ð\89ð\95ú
+}
+}
+
+#endif
--- /dev/null
+// ========================================================================================\r
+// Prefix.h\r
+// ========================================================================================\r
+\r
+#ifndef _Prefix_H\r
+#define _Prefix_H\r
+\r
+#pragma warning(disable : 4127)\r
+#pragma warning(disable : 4512)\r
+\r
+#include <conio.h>\r
+#include <crtdbg.h>\r
+#include <locale.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "Prefix_Integer.h"\r
+\r
+#define delete_(p) { delete p; p = NULL; }\r
+\r
+#define BIT_SHIFT_MASK(value, shift, mask) (((value) >> (shift)) & ((1<<(mask))-1))\r
+\r
+//#define ENV_FACTORY\r
+\r
+#endif\r
--- /dev/null
+// ========================================================================================
+// Prefix_Integer.h
+// ========================================================================================
+
+#ifndef _Prefix_Integer_H
+#define _Prefix_Integer_H
+
+namespace EARTH {
+ typedef signed char sbyte;
+ typedef unsigned char byte;
+
+ typedef unsigned short ushort;
+
+ typedef unsigned long uint;
+
+ typedef signed long long slong;
+ typedef unsigned long long ulong;
+
+ typedef signed long status;
+}
+
+#endif
--- /dev/null
+//\r
+// PT3Core.cpp\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+#include "ry0/device/PT3/PT3Core.h"\r
+#include "ry0/device/PT3/PT3Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT3\r
+{\r
+\r
+PT3Core::PT3Core(EARTH::PT::Bus *bus, const EARTH::PT::Bus::DeviceInfo *deviceInfo, Tuner *tuners[MAX_TUNERS], HMODULE multi2_dll)\r
+{\r
+ DebugLog2("PT3Core::PT3Core()\n");\r
+\r
+ InitializeCriticalSection(&_cs);\r
+\r
+ // initialize: variables\r
+ _device = NULL;\r
+ for (EARTH::uint32 i = 0; i < 4; ++i)\r
+ {\r
+ _tuners[i] = NULL;\r
+ _locked[i] = false;\r
+ }\r
+ _name[0] = '\0';\r
+\r
+ // initialize: PT3\r
+ EARTH::status status;\r
+ status = bus->NewDevice(deviceInfo, &_device, NULL);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Bus::NewDevice() (0x%08x)\n", status);\r
+ throw EXCEPTION_NEW_DEVICE;\r
+ }\r
+\r
+ status = _device->Open();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Open() (0x%08x)\n", status);\r
+ int except = EXCEPTION_OPEN;\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+\r
+ status = _device->InitTuner();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::InitTuner() (0x%08x)\n", status);\r
+ int except = EXCEPTION_INIT_TUNER;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ for (EARTH::uint32 i = 0; i < 2; ++i)\r
+ {\r
+ for (EARTH::uint32 j = 0; j < 2; ++j)\r
+ {\r
+ status = _device->SetTunerSleep(static_cast<EARTH::PT::Device::ISDB>(j), i, false);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetTunerSleep() (0x%08x)\n", status);\r
+ int except = EXCEPTION_SET_TUNER_SLEEP;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+ }\r
+ }\r
+\r
+ int ret = sprintf_s(_name, sizeof(_name), "PT%d@%02d%02d%02d",\r
+ deviceInfo->PTn,\r
+ deviceInfo->Bus,\r
+ deviceInfo->Slot,\r
+ deviceInfo->Function);\r
+ if (ret < 0)\r
+ {\r
+ DebugLog3("error: snprintf() (0x%08x)\n", ret);\r
+ int except = EXCEPTION_OTHER;\r
+ status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ except |= EXCEPTION_CLOSE;\r
+ }\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ except |= EXCEPTION_DELETE;\r
+ }\r
+ throw except;\r
+ }\r
+\r
+ for (EARTH::uint32 i = 0; i < 4; ++i)\r
+ {\r
+ _tuners[i] = new PT3Tuner(this, i, multi2_dll);\r
+ tuners[i] = _tuners[i];\r
+ }\r
+}\r
+\r
+PT3Core::~PT3Core()\r
+{\r
+ DebugLog2("PT3Core::~PT3Core() called\n");\r
+\r
+ if (_device == NULL)\r
+ {\r
+ DebugLog3("_device is NULL.\n");\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ EARTH::status status = _device->Close();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Close() (0x%08x)\n", status);\r
+ }\r
+\r
+ status = _device->Delete();\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::Delete() (0x%08x)\n", status);\r
+ }\r
+ _device = NULL;\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ DeleteCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT3Core::~PT3Core()\n");\r
+}\r
+\r
+void PT3Core::release(Tuner *tuner)\r
+{\r
+ DebugLog2("PT3Core::release()\n");\r
+\r
+ bool exist = false;\r
+ for (EARTH::uint32 i = 0; i < 4; ++i)\r
+ {\r
+ if (_tuners[i] == tuner)\r
+ {\r
+ _tuners[i] = NULL;\r
+ }\r
+ else if (_tuners[i] != NULL)\r
+ {\r
+ exist = true;\r
+ }\r
+ }\r
+ if (!exist)\r
+ {\r
+ DebugLog3("delete.\n");\r
+ delete this;\r
+ }\r
+}\r
+\r
+const char *PT3Core::name()\r
+{\r
+ DebugLog2("PT3Core::name()\n");\r
+ return _name;\r
+}\r
+\r
+bool PT3Core::getCnAgc(EARTH::uint32 tuner, EARTH::uint32 *cn100, EARTH::uint32 *agc, EARTH::uint32 *maxAgc)\r
+{\r
+ DebugLog2("PT3Core::getCnAgc()\n");\r
+ bool result = false;\r
+ if ((tuner < MAX_TUNERS) && (cn100 != NULL) && (agc != NULL) && (maxAgc != NULL))\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ EARTH::status status;\r
+ status = _device->GetCnAgc((tuner % 2 == 0) ? EARTH::PT::Device::ISDB_S : EARTH::PT::Device::ISDB_T,\r
+ tuner / 2, cn100, agc, maxAgc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return result;\r
+}\r
+\r
+bool PT3Core::setChannel(EARTH::uint32 tuner, int channel)\r
+{\r
+ DebugLog2("PT3Core::setChannel(%d, %d)\n", channel, tuner);\r
+\r
+ EARTH::status status;\r
+ bool result = false;\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (tuner >= 0 && tuner < 4)\r
+ {\r
+ if ((tuner % 2) == 0)\r
+ {\r
+ // ISDB-S\r
+ while ((0 <= channel) && (channel <= Tuner::MAX_CHANNELS_ISDB_S))\r
+ {\r
+ EARTH::PT::Device::TmccS tmcc;\r
+ bool tmccIsValid = false;\r
+\r
+ DebugLog2("call SetFrequency()\n");\r
+ status = _device->SetFrequency(EARTH::PT::Device::ISDB_S, (tuner / 2), channel);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetFrequency() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ for (int i = 0; i < 6; ++i)\r
+ {\r
+ status = _device->GetTmccS((tuner / 2), &tmcc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ tmccIsValid = true;\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: Device::GetTmccS() (0x%08x)\n", status);\r
+ }\r
+ ::Sleep(50); // 50 ms\r
+ }\r
+\r
+ result = tmccIsValid;\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // ISDB-T\r
+ while ((0 <= channel) && (channel <= Tuner::MAX_CHANNELS_ISDB_T))\r
+ {\r
+ EARTH::PT::Device::TmccT tmcc;\r
+ bool tmccIsValid = false;\r
+\r
+ status = _device->SetFrequency(EARTH::PT::Device::ISDB_T, (tuner / 2), channel);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: Device::SetFrequency() (0x%08x)\n", status);\r
+ break;\r
+ }\r
+\r
+ for (int i = 0; i < 2; ++i)\r
+ {\r
+ status = _device->GetTmccT((tuner / 2), &tmcc);\r
+ if (status == EARTH::PT::STATUS_OK)\r
+ {\r
+ tmccIsValid = true;\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("error: Device::GetTmccT() (0x%08x)\n", status);\r
+ }\r
+ }\r
+\r
+ result = tmccIsValid;\r
+ break;\r
+ }\r
+ }\r
+ _locked[tuner] = result;\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT3Core::setChannel(%d, %d) end\n", channel, tuner);\r
+\r
+ return result;\r
+}\r
+\r
+EARTH::status PT3Core::setTransferTestMode(Tuner::Type type, uint32_t tuner)\r
+{\r
+// DebugLog2("PT3Core::setTransferTestMode()\n");\r
+ EARTH::status status = EARTH::PT::STATUS_INVALID_PARAM_ERROR;\r
+ if ((tuner < MAX_TUNERS) && (type != Tuner::TYPE_NA))\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ status = _device->SetTransferTestMode((type == Tuner::ISDB_T) ? EARTH::PT::Device::ISDB_T : EARTH::PT::Device::ISDB_S, static_cast<EARTH::uint32>(tuner / 2));\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return status;\r
+}\r
+\r
+EARTH::status PT3Core::setTransferPageDescriptorAddress(Tuner::Type type, uint32_t tuner, EARTH::uint64 pageAddress)\r
+{\r
+// DebugLog2("PT3Core::setTransferPageDescriptorAddress()\n");\r
+ EARTH::status status = EARTH::PT::STATUS_INVALID_PARAM_ERROR;\r
+ if ((tuner < MAX_TUNERS) && (type != Tuner::TYPE_NA))\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ status = _device->SetTransferPageDescriptorAddress((type == Tuner::ISDB_T) ? EARTH::PT::Device::ISDB_T : EARTH::PT::Device::ISDB_S,\r
+ static_cast<EARTH::uint32>(tuner / 2), pageAddress);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return status;\r
+}\r
+\r
+EARTH::status PT3Core::setTransferEnabled(Tuner::Type type, uint32_t tuner, bool enabled)\r
+{\r
+// DebugLog2("PT3Core::setTransferPageDescriptorAddress()\n");\r
+ EARTH::status status = EARTH::PT::STATUS_INVALID_PARAM_ERROR;\r
+ if ((tuner < MAX_TUNERS) && (type != Tuner::TYPE_NA))\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ status = _device->SetTransferEnabled((type == Tuner::ISDB_T) ? EARTH::PT::Device::ISDB_T : EARTH::PT::Device::ISDB_S, static_cast<EARTH::uint32>(tuner / 2), enabled);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ return status;\r
+}\r
+\r
+} // PT3\r
+} // device\r
+} // ry0\r
+\r
--- /dev/null
+//\r
+// PT3Core.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_PT3_PT3CORE_H__\r
+#define __RY0_DEVICE_PT3_PT3CORE_H__\r
+\r
+#include <stdint.h>\r
+#include <windows.h>\r
+#include <process.h>\r
+#include "EARTH_PT3.h"\r
+#include "ry0/device/Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT3\r
+{\r
+\r
+class PT3Tuner;\r
+\r
+class PT3Core\r
+{\r
+ friend class PT3Tuner;\r
+\r
+public:\r
+\r
+ static const int MAX_TUNERS = 4;\r
+ static const int PAGE_SIZE = 4096;\r
+ static const int PAGE_COUNT = 47;\r
+ static const int PACKET_SIZE = 188;\r
+ static const int VIRTUAL_SIZE = 4;\r
+ static const int VIRTUAL_COUNT = 16;\r
+ static const int LOCK_SIZE = 4;\r
+ static const int BUFFER_PAGE_COUNT = 511;\r
+ static const int BLOCK_COUNT = 2;\r
+ static const int BLOCK_SIZE = (PAGE_SIZE * BUFFER_PAGE_COUNT / BLOCK_COUNT);\r
+\r
+\r
+private:\r
+ CRITICAL_SECTION _cs;\r
+ EARTH::PT::Device * _device;\r
+ char _name[64];\r
+\r
+ PT3Tuner * _tuners[MAX_TUNERS];\r
+ bool _locked[MAX_TUNERS];\r
+\r
+ //\r
+ PT3Core(EARTH::PT::Bus *bus, const EARTH::PT::Bus::DeviceInfo *deviceInfo, Tuner *tuners[4], HMODULE multi2_dll);\r
+ ~PT3Core();\r
+\r
+ void release(Tuner *tuner);\r
+\r
+public:\r
+ EARTH::status setTransferTestMode(Tuner::Type type, uint32_t tuner);\r
+ EARTH::status setTransferPageDescriptorAddress(Tuner::Type type, uint32_t tuner, EARTH::uint64 pageAddress);\r
+ EARTH::status setTransferEnabled(Tuner::Type type, uint32_t tuner, bool enabled);\r
+ bool getCnAgc(EARTH::uint32 tuner, EARTH::uint32 *cn100, EARTH::uint32 *agc, EARTH::uint32 *maxAgc);\r
+ bool setChannel(EARTH::uint32 tuner, int channel);\r
+\r
+ const char *name();\r
+};\r
+\r
+} // PT3\r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_PT3_PT3CORE_H__\r
--- /dev/null
+//\r
+// PT3Tuner.cpp\r
+//\r
+\r
+#include <io.h>\r
+#include <new>\r
+#include <share.h>\r
+#include <winsock2.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+#include "ry0/device/PT3/PT3Tuner.h"\r
+#include "ry0/device/PT3/PT3Core.h"\r
+#include "EX_Buffer.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT3\r
+{\r
+\r
+static HMODULE module_ = NULL; // for scan\r
+\r
+int PT3Tuner::scan(Tuner *tuners[], HMODULE multi2_dll)\r
+{\r
+ DebugLog2("%s()", __FUNCTION__);\r
+\r
+ if (module_ == NULL)\r
+ {\r
+ module_ = ::LoadLibrary(L"SDK_EARTHSOFT_PT3.dll");\r
+ if (module_ == NULL)\r
+ {\r
+ DebugLog1("Can't load library: SDK_EARTHSOFT_PT3.dll");\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ EARTH::PT::Bus::NewBusFunction function = reinterpret_cast<EARTH::PT::Bus::NewBusFunction>(::GetProcAddress(module_, "_"));\r
+ if (function == NULL)\r
+ {\r
+ DebugLog0("internal error.");\r
+ return -1;\r
+ }\r
+\r
+ EARTH::PT::Bus *bus = NULL;\r
+ EARTH::status status = function(&bus);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog3("error: NewBusFunction() 0x%08x", status);\r
+ return -1;\r
+ }\r
+\r
+ EARTH::uint32 version;\r
+ bus->GetVersion(&version);\r
+ if ((version >> 8) != 2)\r
+ {\r
+ DebugLog3("no support version");\r
+ return -1;\r
+ }\r
+\r
+\r
+ EARTH::PT::Bus::DeviceInfo deviceInfo[ry0::device::MAX_DEVICES];\r
+ EARTH::uint32 deviceInfoCount = sizeof(deviceInfo)/sizeof(*deviceInfo);\r
+ bus->Scan(deviceInfo, &deviceInfoCount);\r
+\r
+ DebugLog3("deviceInfoCount = %d", deviceInfoCount);\r
+\r
+ int tunerCount = 0;\r
+\r
+ for (EARTH::uint32 i = 0; i < deviceInfoCount; ++i)\r
+ {\r
+ try\r
+ {\r
+ PT3Core *core = new PT3Core(bus, &deviceInfo[i], &tuners[tunerCount], multi2_dll);\r
+ tunerCount += PT3Core::MAX_TUNERS;\r
+ }\r
+ catch (int e)\r
+ {\r
+ DebugLog0("throw %d", e);\r
+ }\r
+ catch (const std::bad_alloc& e)\r
+ {\r
+ DebugLog0("throw bad_alloc %s", e);\r
+ }\r
+ }\r
+\r
+ return tunerCount;\r
+}\r
+\r
+unsigned __stdcall PT3Tuner_transfer(void *arg)\r
+{\r
+ ((PT3Tuner *)arg)->transfer();\r
+ return 0;\r
+}\r
+\r
+PT3Tuner::PT3Tuner(PT3Core *core, uint32_t tuner, HMODULE multi2_dll)\r
+{\r
+ DebugLog2("PT3Tuner::PT3Tuner()");\r
+\r
+ InitializeCriticalSection(&_cs);\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ _core = core;\r
+ _tuner = tuner;\r
+ _listener = NULL;\r
+ memset(_name, sizeof(_name), 0x00);\r
+ _channel = -1;\r
+ _recording = false;\r
+ _recfd = -1;\r
+\r
+ _blockIndex = 0;\r
+ _buffer = NULL;\r
+\r
+ _b25 = NULL;\r
+ _bcas = NULL;\r
+\r
+ while (multi2_dll != NULL)\r
+ {\r
+ // create "B25" & initialize\r
+ ARIB_STD_B25 *(*func_b25)();\r
+ func_b25 = reinterpret_cast<ARIB_STD_B25 *(*)()>(::GetProcAddress(multi2_dll, "create_arib_std_b25"));\r
+ if (func_b25 == NULL)\r
+ {\r
+ DebugLog0("b25 func address get ng.");\r
+ break;\r
+ }\r
+ _b25 = func_b25();\r
+ if (_b25 == NULL)\r
+ {\r
+ DebugLog0("b25 create ng.");\r
+ break;\r
+ }\r
+\r
+ int ret = _b25->set_multi2_round(_b25, 4);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set multi2 round ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ ret = _b25->set_strip(_b25, 0);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set strip ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ ret = _b25->set_emm_proc(_b25, 0);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("b25 set emm proc ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ // create "B-CAS" & initialize\r
+ B_CAS_CARD *(*func_bcas)();\r
+ func_bcas = reinterpret_cast<B_CAS_CARD *(*)()>(::GetProcAddress(multi2_dll, "create_b_cas_card"));\r
+ if (func_bcas == NULL)\r
+ {\r
+ // 関数アドレス取得NG\r
+ DebugLog0("bcas func address get ng.");\r
+ break;\r
+ }\r
+ _bcas = func_bcas();\r
+ if (_bcas == NULL)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ DebugLog0("bcas create ng.");\r
+ break;\r
+ }\r
+\r
+ ret = _bcas->init(_bcas);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ DebugLog0("bcas init ng. %d", ret);\r
+ break;\r
+ }\r
+ ret = _b25->set_b_cas_card(_b25, _bcas);\r
+ if (ret != 0)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ DebugLog0("b25 set bcas card ng. %d", ret);\r
+ break;\r
+ }\r
+\r
+ DebugLog2("b25 & bcas initialize success.");\r
+\r
+ break;\r
+ }\r
+\r
+// WSADATA wsaData;\r
+// WSAStartup(MAKEWORD(2,0), &wsaData);\r
+\r
+ if ((_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)\r
+ {\r
+ DebugLog0("fatal error occured: socket(): 0x%08x\n", WSAGetLastError());\r
+ abort();\r
+ }\r
+ struct sockaddr_in own_addr;\r
+ own_addr.sin_family = AF_INET;\r
+ own_addr.sin_port = 0;\r
+ own_addr.sin_addr.s_addr = INADDR_ANY;\r
+ if (bind(_udp, (struct sockaddr *)&own_addr, sizeof(own_addr)) == SOCKET_ERROR)\r
+ {\r
+ DebugLog0("fatal error occured: bind()\n");\r
+ abort();\r
+ }\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+\r
+ HANDLE h;\r
+ unsigned int uiThreadId;\r
+ h = (HANDLE)_beginthreadex(NULL,\r
+ 0,\r
+ PT3Tuner_transfer,\r
+ this,\r
+ 0,\r
+ &uiThreadId);\r
+ if (h != NULL)\r
+ {\r
+ _transfer = ST_READY;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ bool needSleep = false;\r
+ EnterCriticalSection(&_cs);\r
+\r
+ if (_transfer == ST_IDLE)\r
+ {\r
+ done = true;\r
+ }\r
+ else if (_transfer == ST_RUN)\r
+ {\r
+ done = true;\r
+ }\r
+ else if (_transfer == ST_READY)\r
+ {\r
+ needSleep = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ if (needSleep)\r
+ {\r
+ ::Sleep(100); // 100 ms\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+ else\r
+ {\r
+ throw EXCEPTION_OTHER;\r
+ }\r
+\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+PT3Tuner::~PT3Tuner()\r
+{\r
+ DebugLog3("PT3Tuner::~PT3Tuner() called.\n");\r
+ EnterCriticalSection(&_cs);\r
+ if (_bcas != NULL)\r
+ {\r
+ _bcas->release(_bcas);\r
+ _bcas = NULL;\r
+ }\r
+ if (_b25 != NULL)\r
+ {\r
+ _b25->release(_b25);\r
+ _b25 = NULL;\r
+ }\r
+ if (_recfd != -1)\r
+ {\r
+ _recfd = -1;\r
+ }\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+ }\r
+ _listener = NULL;\r
+\r
+ if (_transfer == ST_RUN)\r
+ {\r
+ _transfer = ST_STOP;\r
+ LeaveCriticalSection(&_cs);\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ EnterCriticalSection(&_cs);\r
+ done = (_transfer == ST_IDLE);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+ EnterCriticalSection(&_cs);\r
+ }\r
+\r
+ closesocket(_udp);\r
+ delete _buffer;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ _core->release(this);\r
+\r
+ DeleteCriticalSection(&_cs);\r
+\r
+ DebugLog3("PT3Tuner::~PT3Tuner()\n");\r
+}\r
+\r
+void PT3Tuner::setListener(Listener *listener)\r
+{\r
+ DebugLog2("PT3Tuner::setListener()\n");\r
+ EnterCriticalSection(&_cs);\r
+ _listener = listener;\r
+ LeaveCriticalSection(&_cs);\r
+ DebugLog2("PT3Tuner::setListener() end\n");\r
+}\r
+\r
+const char *PT3Tuner::name()\r
+{\r
+ DebugLog2("PT3Tuner::name()\n");\r
+\r
+ EnterCriticalSection(&_cs);\r
+ if (strlen(_name) == 0)\r
+ {\r
+ sprintf_s(_name, sizeof(_name), "%s-%02d", _core->name(), _tuner);\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ return _name;\r
+}\r
+\r
+Tuner::Type PT3Tuner::type()\r
+{\r
+// DebugLog2("PT3Tuner::type()\n");\r
+\r
+ switch (_tuner)\r
+ {\r
+ case 0:\r
+ case 2:\r
+ return ISDB_S;\r
+ case 1:\r
+ case 3:\r
+ return ISDB_T;\r
+ }\r
+ return TYPE_NA;\r
+}\r
+\r
+Tuner::LnbPower PT3Tuner::lnbPower()\r
+{\r
+ DebugLog2("PT3Tuner::lnbPower()\n");\r
+\r
+ return LNB_POWER_OFF;\r
+}\r
+\r
+bool PT3Tuner::getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc)\r
+{\r
+ DebugLog2("PT3Tuner::getCnAgc()\n");\r
+ bool result = false;\r
+ if ((cn100 != NULL) && (agc != NULL) && (maxAgc != NULL))\r
+ {\r
+ result = _core->getCnAgc(_tuner, (EARTH::uint32 *)cn100, (EARTH::uint32 *)agc, (EARTH::uint32 *)maxAgc);\r
+ }\r
+ return result;\r
+}\r
+\r
+int PT3Tuner::channel()\r
+{\r
+ int result = -1;\r
+ EnterCriticalSection(&_cs);\r
+ result = _channel;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::setChannel(int channel)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (_channel != channel)\r
+ {\r
+ if (!_recording)\r
+ {\r
+ result = _core->setChannel(_tuner, channel);\r
+ if (result)\r
+ {\r
+ _channel = channel;\r
+ }\r
+ else\r
+ {\r
+ _channel = -1;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::startRecording(int fd)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if ((!_recording) && (!_locked) && (fd >= 0))\r
+ {\r
+ _recording = true;\r
+ _locked = true;\r
+ _recfd = fd;\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+int PT3Tuner::stopRecording()\r
+{\r
+ int result = -1;\r
+ EnterCriticalSection(&_cs);\r
+ if (_recording)\r
+ {\r
+ _recording = false;\r
+ if (_dst_addr.sin_family != AF_INET)\r
+ {\r
+ _locked = false;\r
+ }\r
+ result = _recfd;\r
+ _recfd = -1;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::isRecording()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = _recording;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::lock()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (!_locked)\r
+ {\r
+ _locked = true;\r
+ result = true;\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+void PT3Tuner::unlock()\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ if (_locked)\r
+ {\r
+ if (!_recording)\r
+ {\r
+ _locked = false;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+bool PT3Tuner::isLocked()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = _locked;\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::startStreaming(struct sockaddr_in *addr)\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ if (_dst_addr.sin_family == AF_UNSPEC)\r
+ {\r
+ if (addr->sin_family == AF_INET)\r
+ {\r
+ _dst_addr = *addr;\r
+ _locked = true;\r
+ result = true;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+void PT3Tuner::stopStreaming()\r
+{\r
+ EnterCriticalSection(&_cs);\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+ _dst_addr.sin_family = AF_UNSPEC;\r
+ if (!_recording)\r
+ {\r
+ _locked = false;\r
+ }\r
+ }\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+bool PT3Tuner::isStreaming()\r
+{\r
+ bool result = false;\r
+ EnterCriticalSection(&_cs);\r
+ result = (_dst_addr.sin_family == AF_INET);\r
+ LeaveCriticalSection(&_cs);\r
+ return result;\r
+}\r
+\r
+bool PT3Tuner::checkReady(uint32_t blockIndex)\r
+{\r
+ volatile EARTH::uint8 *ptr = static_cast<EARTH::uint8 *>(_buffer->Ptr(static_cast<EARTH::uint32>(blockIndex)));\r
+ if (ptr == NULL)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ EARTH::uint8 data = ptr[0];\r
+ EARTH::status status = _buffer->SyncCpu(blockIndex);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ if (data == 0x47)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ if (data == NOT_SYNC_BYTE)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+void PT3Tuner::transfer()\r
+{\r
+ DebugLog2("PT3Tuner::transfer() called.\n");\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ while (true)\r
+ {\r
+ DebugLog2("PT3Tuner[%02d]::transfer() Begin:\n", _tuner);\r
+\r
+ // Begin()\r
+ EARTH::status status;\r
+\r
+ _blockIndex = 0;\r
+\r
+ if (_buffer == NULL)\r
+ {\r
+ _buffer = new EARTH::EX::Buffer(_core->_device);\r
+\r
+ status = _buffer->Alloc(BLOCK_SIZE, BLOCK_COUNT);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("_buffer->Alloc() NG\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+ }\r
+\r
+ EARTH::uint8 *ptr = static_cast<EARTH::uint8 *>(_buffer->Ptr(0));\r
+ if (ptr == NULL)\r
+ {\r
+ DebugLog0("_buffer->Ptr() NG: 01\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ bool sync_error = false;\r
+ for (EARTH::uint32 i = 0; i < BLOCK_COUNT; ++i)\r
+ {\r
+ ptr[BLOCK_SIZE * i] = NOT_SYNC_BYTE;\r
+ status = _buffer->SyncCpu(i);\r
+\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ sync_error = true;\r
+ break;\r
+ }\r
+ }\r
+ if (sync_error)\r
+ {\r
+ DebugLog0("sync_error\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ status = _core->setTransferTestMode(type(), _tuner);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("_core->setTransferTestMode() NG\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+\r
+ EARTH::uint64 pageAddress = _buffer->PageDescriptorAddress();\r
+\r
+ status = _core->setTransferPageDescriptorAddress(type(), _tuner, pageAddress);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("_core->setTransferPageDescriptorAddress() NG\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ status = _core->setTransferEnabled(type(), _tuner, true);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("_core->setTransferEnabled() NG\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ ptr = static_cast<EARTH::uint8 *>(_buffer->Ptr(0));\r
+ if (ptr == NULL)\r
+ {\r
+ DebugLog0("_buffer->Ptr() NG: 02\n");\r
+ LeaveCriticalSection(&_cs);\r
+ break;\r
+ }\r
+\r
+ _transfer = ST_RUN;\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+ DebugLog2("PT3Tuner[%02d]::transfer() Loop:\n", _tuner);\r
+\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ //OS::Thread::Sleep(1);\r
+ ::Sleep(1); // 1ms\r
+\r
+ EARTH::uint32 nextWriteIndex = _blockIndex + 1;\r
+ if (BLOCK_COUNT <= nextWriteIndex)\r
+ {\r
+ nextWriteIndex = 0;\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() before checkReady:\n", _tuner);\r
+ while (checkReady(nextWriteIndex))\r
+ {\r
+ //Write(_blockIndex);\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 001\n", _tuner);\r
+\r
+ status = _buffer->SyncIo(_blockIndex);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("SyncIo error.\n");\r
+ break;\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 002\n", _tuner);\r
+\r
+ ptr = static_cast<EARTH::uint8 *>(_buffer->Ptr(_blockIndex));\r
+ if (ptr == NULL)\r
+ {\r
+ DebugLog0("_buffer->Ptr() error.\n");\r
+ break;\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 003\n", _tuner);\r
+\r
+ EnterCriticalSection(&_cs);\r
+\r
+ uint8_t *buf = ptr;\r
+ int32_t size = BLOCK_SIZE;\r
+ if (_b25 != NULL)\r
+ {\r
+ // MULTI2 Decode\r
+ ARIB_STD_B25_BUFFER sBuffer, dBuffer;\r
+ sBuffer.data = buf;\r
+ sBuffer.size = size;\r
+ dBuffer.data = NULL;\r
+ dBuffer.size = 0;\r
+\r
+ int ret = _b25->put(_b25, &sBuffer);\r
+ if (ret >= 0)\r
+ {\r
+ ret = _b25->get(_b25, &dBuffer);\r
+ if (ret >= 0)\r
+ {\r
+ buf = dBuffer.data;\r
+ size = dBuffer.size;\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("_b25->get() NG. %d\n", ret);\r
+ _b25->reset(_b25);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("_b25->put() NG. %d\n", ret);\r
+ _b25->reset(_b25);\r
+ }\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 004\n", _tuner);\r
+\r
+ // recording\r
+ if (_recfd >= 0)\r
+ {\r
+ _write(_recfd, buf, size);\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 005\n", _tuner);\r
+\r
+ // streaming\r
+ if (_dst_addr.sin_family == AF_INET)\r
+ {\r
+#if 1\r
+ int32_t offset = 0;\r
+ int32_t unit = 188 * 4;\r
+ int32_t remain = size;\r
+ while (remain > 0)\r
+ {\r
+ if (remain < unit)\r
+ {\r
+ unit = remain;\r
+ }\r
+ int len = sendto(_udp, (const char *)&buf[offset], unit, 0, (struct sockaddr *)&_dst_addr, sizeof(struct sockaddr_in));\r
+ if (len > 0)\r
+ {\r
+ remain -= len;\r
+ offset += len;\r
+ }\r
+ else\r
+ {\r
+ char tmp[1024];\r
+ strerror_s(tmp, sizeof(tmp), errno);\r
+ DebugLog3("len = %d, %s\n", len, tmp);\r
+ break;\r
+ }\r
+ }\r
+#else\r
+ sendto(_udp, (const char *)buf, size, 0, (struct sockaddr *)&_dst_addr, sizeof(struct sockaddr_in));\r
+#endif\r
+ }\r
+ \r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 006\n", _tuner);\r
+\r
+ // listener\r
+ if (_listener != NULL)\r
+ {\r
+ DebugLog3("check \n");\r
+ _listener->put(buf, size);\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 007\n", _tuner);\r
+\r
+ LeaveCriticalSection(&_cs);\r
+\r
+\r
+ ptr[0] = NOT_SYNC_BYTE;\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 008\n", _tuner);\r
+ status = _buffer->SyncCpu(_blockIndex);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ DebugLog0("SyncCpu error.\n");\r
+ break;\r
+ }\r
+\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 009\n", _tuner);\r
+ _blockIndex++;\r
+ if (BLOCK_COUNT <= _blockIndex)\r
+ {\r
+ _blockIndex = 0;\r
+ }\r
+// DebugLog3("PT3Tuner[%02d]::transfer() check 010\n", _tuner);\r
+\r
+ break;\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ done = (_transfer != ST_RUN);\r
+ LeaveCriticalSection(&_cs);\r
+ }\r
+\r
+ DebugLog2("PT3Tuner[%02d]::transfer() End:\n", _tuner);\r
+\r
+ // End\r
+ status = _core->setTransferEnabled(type(), _tuner, false);\r
+ if (status != EARTH::PT::STATUS_OK)\r
+ {\r
+ }\r
+\r
+ if (done)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection(&_cs);\r
+ _transfer = ST_IDLE;\r
+ LeaveCriticalSection(&_cs);\r
+}\r
+\r
+} // PT3\r
+} // device\r
+} // ry0\r
--- /dev/null
+//\r
+// PT3Tuner.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_PT3_PT3TUNER_H__\r
+#define __RY0_DEVICE_PT3_PT3TUNER_H__\r
+\r
+#include <stdint.h>\r
+#include "ry0/device/Tuner.h"\r
+#include "b25/arib_std_b25.h"\r
+#include "b25/b_cas_card.h"\r
+\r
+namespace EARTH\r
+{\r
+namespace EX\r
+{\r
+class Buffer;\r
+}\r
+}\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+namespace PT3\r
+{\r
+\r
+static const int PAGE_SIZE = 4096;\r
+static const int BLOCK_COUNT = 32;\r
+static const int BLOCK_SIZE = (PAGE_SIZE * 47 * 8);\r
+\r
+ static const int EXCEPTION_NEW_DEVICE = 0x00000001;\r
+ static const int EXCEPTION_DELETE = 0x00000002;\r
+ static const int EXCEPTION_OPEN = 0x00000004;\r
+ static const int EXCEPTION_CLOSE = 0x00000008;\r
+ static const int EXCEPTION_INIT_TUNER = 0x00000010;\r
+ static const int EXCEPTION_SET_TUNER_POWER_RESET = 0x00000020;\r
+ static const int EXCEPTION_SET_TUNER_SLEEP = 0x00000040;\r
+ static const int EXCEPTION_SET_STREAM_ENABLE = 0x00000080;\r
+ static const int EXCEPTION_SET_STREAM_GRAY = 0x00000100;\r
+ static const int EXCEPTION_OTHER = 0x80000000;\r
+\r
+static const unsigned int NOT_SYNC_BYTE = 0x74;\r
+\r
+class PT3Core;\r
+\r
+class PT3Tuner : public Tuner\r
+{\r
+ friend class PT3Core;\r
+\r
+private:\r
+ CRITICAL_SECTION _cs;\r
+ PT3Core * _core;\r
+ Listener * _listener;\r
+ uint32_t _tuner;\r
+ char _name[64];\r
+ int _channel;\r
+ bool _recording;\r
+ int _recfd;\r
+ bool _locked;\r
+\r
+ // temporary\r
+ SOCKET _udp;\r
+ struct sockaddr_in _dst_addr;\r
+\r
+ enum {\r
+ ST_IDLE = 0,\r
+ ST_READY,\r
+ ST_RUN,\r
+ ST_STOP} _transfer;\r
+\r
+ uint32_t _blockIndex;\r
+ EARTH::EX::Buffer * _buffer;\r
+\r
+ ARIB_STD_B25 * _b25;\r
+ B_CAS_CARD * _bcas;\r
+\r
+ PT3Tuner(PT3Core *core, uint32_t tuner, HMODULE multi2_dll);\r
+ ~PT3Tuner();\r
+\r
+ void addPacket(uint32_t packet);\r
+\r
+public:\r
+ void setListener(Listener *listener);\r
+ const char *name();\r
+ Type type();\r
+ LnbPower lnbPower();\r
+ bool getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc);\r
+ int channel();\r
+ bool setChannel(int channel);\r
+ bool startRecording(int fd);\r
+ int stopRecording();\r
+ bool isRecording();\r
+ bool lock();\r
+ void unlock();\r
+ bool isLocked();\r
+\r
+ // temporary\r
+ bool startStreaming(struct sockaddr_in *);\r
+ void stopStreaming();\r
+ bool isStreaming();\r
+\r
+ bool checkReady(uint32_t bloclIndex);\r
+ void transfer();\r
+\r
+ //\r
+ static int scan(Tuner *tuners[], HMODULE multi2_dll);\r
+};\r
+\r
+} // PT3\r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_PT3_PT3TUNER_H__\r
--- /dev/null
+// ========================================================================================
+// EARTH_PT3.h
+// \83o\81[\83W\83\87\83\93 3.0 (2013.10.15)
+// ========================================================================================
+
+#ifndef _EARTH_PT3_H
+#define _EARTH_PT3_H
+
+#include "Prefix.h"
+
+namespace EARTH {
+namespace PT {
+ class Device;
+ class Device_;
+
+ // +------------+
+ // | \83o\83X\83N\83\89\83X |
+ // +------------+
+ // \83o\83X\8fã\82Ì\83f\83o\83C\83X\82ð\97ñ\8b\93\82µ\82Ü\82·\81B\82Ü\82½\83f\83o\83C\83X\83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬\82µ\82Ü\82·\81B
+ class Bus {
+ public:
+ // [\8b@\94\] Bus \83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬
+ // [\90à\96¾] \97\98\97p\91Î\8fÛ\83h\83\89\83C\83o\96¼\82Í "windrvr6_EARTHSOFT_PT3" \82Å\82·\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 bus \82ª NULL
+ // STATUS_WDAPI_LOAD_ERROR \81¨ LoadLibrary(TEXT("wdapi####.dll")) \82Ì\95Ô\92l\82ª NULL [#### \82Í\83o\81[\83W\83\87\83\93\94Ô\8d\86]
+ // STATUS_WD_DriverName_ERROR \81¨ WD_DriverName() \82Ì\95Ô\92l\82ª NULL
+ // STATUS_WD_Open_ERROR \81¨ WD_Open() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_Version_ERROR \81¨ WD_Version() \82Å\83G\83\89\81[\82ª\94\90¶\81B\82Ü\82½\82Í\83o\81[\83W\83\87\83\93\82ª 11.1.0 \82Å\82È\82¢
+ // STATUS_WD_License_ERROR \81¨ WD_License() \82Å\83G\83\89\81[\82ª\94\90¶
+ typedef status (*NewBusFunction)(Bus **bus);
+
+ // [\8b@\94\] \83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú
+ // [\90à\96¾] delete \82Í\8eg\82¦\82Ü\82¹\82ñ\81B\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_ALL_DEVICES_MUST_BE_DELETED_ERROR \81¨ NewDevice() \82Å\90¶\90¬\82³\82ê\82½\83f\83o\83C\83X\82ª\91S\82Ä Delete() \82³\82ê\82Ä\82¢\82È\82¢
+ virtual status Delete() = 0;
+
+ // [\8b@\94\] SDK \83o\81[\83W\83\87\83\93\82ð\8eæ\93¾
+ // [\90à\96¾] \83o\81[\83W\83\87\83\93\82ª 2.0 \82Ì\8fê\8d\87\81A\92l\82Í 0x200 \82É\82È\82è\82Ü\82·\81B
+ // \8fã\88Ê 24 \83r\83b\83g\82ª\93¯\82¶\82Å\82 \82ê\82Î\83o\83C\83i\83\8a\8cÝ\8a·\82É\82È\82é\82æ\82¤\82É\93w\82ß\82Ü\82·\82Ì\82Å\81A
+ // ((version >> 8) == 2) \82Å\82 \82é\82©\82ð\83`\83F\83b\83N\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 version \82ª NULL
+ virtual status GetVersion(uint32 *version) const = 0;
+
+ // \83f\83o\83C\83X\8fî\95ñ
+ struct DeviceInfo {
+ uint32 Bus; // PCI \83o\83X\94Ô\8d\86
+ uint32 Slot; // PCI \83f\83o\83C\83X\94Ô\8d\86
+ uint32 Function; // PCI \83t\83@\83\93\83N\83V\83\87\83\93\94Ô\8d\86 (\90³\8fí\93®\8dì\8e\9e\82Í\95K\82¸ 0 \82É\82È\82è\82Ü\82·)
+ uint32 PTn; // \95i\94Ô (PT3:3)
+ };
+
+ // [\8b@\94\] \94F\8e¯\82³\82ê\82Ä\82¢\82é\83f\83o\83C\83X\82Ì\83\8a\83X\83g\82ð\8eæ\93¾
+ // [\90à\96¾] PCI \83o\83X\82ð\83X\83L\83\83\83\93\82µ\82Ä\83f\83o\83C\83X\82ð\83\8a\83X\83g\83A\83b\83v\82µ\82Ü\82·\81B
+ // deviceInfoCount \82Í\8cÄ\82Ñ\8fo\82µ\91O\82É\83f\83o\83C\83X\82Ì\8fã\8cÀ\90\94\82ð\8ew\92è\82µ\82Ü\82·\81B\8cÄ\8fo\82µ\8cã\82Í\8c©\82Â\82©\82Á\82½\83f\83o\83C\83X\90\94\82ð\95Ô\82µ\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 deviceInfoPtr, deviceInfoCount \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // STATUS_WD_PciScanCards_ERROR \81¨ WD_PciScanCards \82Å\83G\83\89\81[\82ª\94\90¶
+ virtual status Scan(DeviceInfo *deviceInfoPtr, uint32 *deviceInfoCount) = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\83C\83\93\83X\83^\83\93\83X\82ð\90¶\90¬\82·\82é
+ // [\90à\96¾] \83f\83o\83C\83X\83\8a\83\\81[\83X\82Ì\94r\91¼\83`\83F\83b\83N\82Í\82±\82Ì\8aÖ\90\94\82Å\82Í\8ds\82í\82ê\82Ü\82¹\82ñ\81BDevice::Open() \82Å\8ds\82í\82ê\82Ü\82·\81B
+ // Device_ \82Í\94ñ\8cö\8aJ\83C\83\93\83^\81[\83t\83F\81[\83X\82Å\82·\81Bdevice_ \82Í NULL \82É\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 deviceInfoPtr, device \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // \82Ü\82½\82Í\88ø\90\94 _device \82ª NULL \82Å\82È\82¢
+ virtual status NewDevice(const DeviceInfo *deviceInfoPtr, Device **device, Device_ **device_ = NULL) = 0;
+
+ protected:
+ virtual ~Bus() {}
+ };
+
+ // +----------------+
+ // | \83f\83o\83C\83X\83N\83\89\83X |
+ // +----------------+
+ // \82±\82Ì\83C\83\93\83X\83^\83\93\83X 1 \82Â\82ª\83{\81[\83h 1 \96\87\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+ class Device {
+ public:
+ // ----
+ // \89ð\95ú
+ // ----
+
+ // [\8b@\94\] \83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú
+ // [\90à\96¾] delete \82Í\8eg\82¦\82Ü\82¹\82ñ\81B\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_DEVICE_MUST_BE_CLOSED_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\8fó\91Ô\82È\82Ì\82Å\83C\83\93\83X\83^\83\93\83X\82ð\89ð\95ú\82Å\82«\82È\82¢
+ virtual status Delete() = 0;
+
+ // ------------------
+ // \83I\81[\83v\83\93\81E\83N\83\8d\81[\83Y
+ // ------------------
+
+ // [\8b@\94\] \83f\83o\83C\83X\82Ì\83I\81[\83v\83\93
+ // [\90à\96¾] \88È\89º\82Ì\8eè\8f\87\82É\89\88\82Á\82Ä\8ds\82í\82ê\82Ü\82·\81B
+ // 1. \8aù\82É\83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢\82©\82ð\8am\94F\82·\82é\81B
+ // 2. \83\8a\83r\83W\83\87\83\93ID (\83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ \83A\83h\83\8c\83X 0x08) \82ª 0x01 \82Å\82 \82é\82©\82ð\92²\82×\82é\81B
+ // 3. \83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ\82Ì\83f\83o\83C\83X\8cÅ\97L\83\8c\83W\83X\83^\97Ì\88æ\82ð\8eg\82Á\82Ä PCI \83o\83X\82Å\82Ì\83r\83b\83g\89»\82¯\82ª\82È\82¢\82©\82ð\8am\94F\82·\82é\81B
+ // 4. \82±\82Ì SDK \82Å\90§\8cä\82ª\89Â\94\\82È FPGA \89ñ\98H\82Ì\83o\81[\83W\83\87\83\93\82Å\82 \82é\82©\82ð\8am\94F\82·\82é\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_ALREADY_OPEN_ERROR \81¨ \83f\83o\83C\83X\82Í\8aù\82É\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82é
+ // STATUS_WD_PciGetCardInfo_ERROR \81¨ WD_PciGetCardInfo() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_PciGetCardInfo_Bus_ERROR \81¨ \83o\83X\8fî\95ñ\90\94\82ª 1 \88È\8aO
+ // STATUS_WD_PciGetCardInfo_Memory_ERROR \81¨ \83\81\83\82\83\8a\8fî\95ñ\90\94\82ª 1 \88È\8aO
+ // STATUS_WD_CardRegister_ERROR \81¨ WD_CardRegister() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_WD_PciConfigDump_ERROR \81¨ WD_PciConfigDump() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_CONFIG_REVISION_ERROR \81¨ \83\8a\83r\83W\83\87\83\93ID \82ª 0x01 \82Å\82È\82¢
+ // STATUS_PCI_BUS_ERROR \81¨ PCI \83o\83X\82Å\82Ì\83r\83b\83g\89»\82¯\82ª\94\90¶
+ // STATUS_PCI_BASE_ADDRESS_ERROR \81¨ \83R\83\93\83t\83B\83M\83\85\83\8c\81[\83V\83\87\83\93\8bó\8aÔ\82Ì BaseAddress0 \82ª 0
+ // STATUS_FPGA_VERSION_ERROR \81¨ \91Î\89\9e\82µ\82Ä\82¢\82È\82¢ FPGA \89ñ\98H\83o\81[\83W\83\87\83\93
+ // STATUS_WD_CardCleanupSetup_ERROR \81¨ WD_CardCleanupSetup() \82Å\83G\83\89\81[\82ª\94\90¶
+ // STATUS_DCM_LOCK_TIMEOUT_ERROR \81¨ DCM \82ª\88ê\92è\8e\9e\8aÔ\8co\89ß\8cã\82à\83\8d\83b\83N\8fó\91Ô\82É\82È\82ç\82È\82¢
+ // STATUS_DCM_SHIFT_TIMEOUT_ERROR \81¨ DCM \82Ì\83t\83F\81[\83Y\83V\83t\83g\82ª\88ê\92è\8e\9e\8aÔ\8co\89ß\8cã\82à\8a®\97¹\82µ\82È\82¢
+ virtual status Open() = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\82Ì\83N\83\8d\81[\83Y
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ virtual status Close() = 0;
+
+ // ------------
+ // \8cÅ\92è\8fî\95ñ\8eæ\93¾
+ // ------------
+ struct ConstantInfo {
+ uint8 PTn; // \83\8c\83W\83X\83^ 0x00 [31:24]
+ uint8 Version_RegisterMap; // \83\8c\83W\83X\83^ 0x00 [23:16]
+ uint8 Version_FPGA; // \83\8c\83W\83X\83^ 0x00 [15: 8]
+ bool CanTransportTS; // \83\8c\83W\83X\83^ 0x0c [ 5]
+ uint32 BitLength_PageDescriptorSize; // \83\8c\83W\83X\83^ 0x0c [ 4: 0]
+ };
+
+ virtual status GetConstantInfo(ConstantInfo *) const = 0;
+
+ // ------------
+ // \93d\8c¹\81E\8f\89\8aú\89»
+ // ------------
+
+ enum LnbPower {
+ LNB_POWER_OFF, // \83I\83t
+ LNB_POWER_15V, // 15V \8fo\97Í
+ LNB_POWER_11V // 11V \8fo\97Í
+ };
+
+ // [\8b@\94\] LNB \93d\8c¹\90§\8cä
+ // [\90à\96¾] \83`\83\85\81[\83i\81[\82Ì\93d\8c¹\82Æ\82Í\93Æ\97§\82É\90§\8cä\89Â\94\\82Å\82·\81B\83f\83t\83H\83\8b\83g\92l\82Í LNB_POWER_OFF \82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 lnbPower \82ª NULL (GetLnbPower \82Ì\82Ý)
+ virtual status SetLnbPower(LnbPower lnbPower) = 0;
+ virtual status GetLnbPower(LnbPower *lnbPower) const = 0;
+
+ // [\8b@\94\] \83f\83o\83C\83X\82ð\83N\83\8d\81[\83Y\81i\88Ù\8fí\8fI\97¹\82É\82Æ\82à\82È\82¤\83N\83\8d\81[\83Y\82ð\8aÜ\82Þ\81j\8e\9e\82Ì LNB \93d\8c¹\90§\8cä
+ // [\90à\96¾] \83f\83t\83H\83\8b\83g\92l\82Í LNB_POWER_OFF \82Å\82·\81B
+ // [\95Ô\92l] STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 lnbPower \82ª NULL (GetLnbPowerWhenClose \82Ì\82Ý)
+ // [\95Ï\8dX] \83o\81[\83W\83\87\83\93 3.0 \82©\82ç\82±\82ê\82ç\82Ì\8aÖ\90\94\82Ì\93®\8dì\82ª\95Ï\8dX\82³\82ê\82Ü\82µ\82½\81B\r
+ // LNB_POWER_15V \82Ü\82½\82Í LNB_POWER_11V \82É\90Ý\92è\82·\82é\8fê\8d\87\82Í\81A\r
+ // Open() \82Ì\91O\82É SetLnbPowerWhenClose() \82ð\83R\81[\83\8b\82µ\82Ü\82·\81B\r
+ virtual status SetLnbPowerWhenClose(LnbPower lnbPower) = 0;
+ virtual status GetLnbPowerWhenClose(LnbPower *lnbPower) const = 0;
+
+ // [\8b@\94\] \83`\83\85\81[\83i\81[\8f\89\8aú\89»
+ // [\90à\96¾] \83`\83\85\81[\83i\81[\82ð\8f\89\8aú\89»\82µ\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_I2C_ERROR \81¨ \95\9c\92²IC \82©\82ç\83\8a\81[\83h\82µ\82½\83\8c\83W\83X\83^\92l\82ª\88Ù\8fí
+ virtual status InitTuner() = 0;
+
+ // \8eó\90M\95û\8e®
+ enum ISDB {
+ ISDB_S,
+ ISDB_T,
+
+ ISDB_COUNT
+ };
+
+ // [\8b@\94\] \83`\83\85\81[\83i\81[\8fÈ\93d\97Í\90§\8cä
+ // [\90à\96¾] \83`\83\85\81[\83i\81[\8f\89\8aú\8cã\82Í\8fÈ\93d\97Í\83I\83\93\82É\82È\82Á\82Ä\82¢\82Ü\82·\82Ì\82Å\81A\8eó\90M\91O\82É\8fÈ\93d\97Í\82ð\83I\83t\82É\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 sleep \82ª NULL (GetTunerSleep \82Ì\82Ý)
+ virtual status SetTunerSleep(ISDB isdb, uint32 index, bool sleep) = 0;
+ virtual status GetTunerSleep(ISDB isdb, uint32 index, bool *sleep) const = 0;
+
+ // ----------
+ // \8bÇ\94\8eü\94g\90\94
+ // ----------
+
+ // [\8b@\94\] \8bÇ\94\8eü\94g\90\94\82Ì\90§\8cä
+ // [\90à\96¾] offset \82Å\8eü\94g\90\94\82Ì\92²\90®\82ª\89Â\94\\82Å\82·\81B\92P\88Ê\82Í ISDB-S \82Ì\8fê\8d\87\82Í 1kHz\81AISDB-T \82Ì\8fê\8d\87\82Í 1/7MHz \82Å\82·\81B
+ // \97á\82¦\82Î\81AC24 \82ð\95W\8f\80\82æ\82è 2MHz \8d\82\82¢\8eü\94g\90\94\82É\90Ý\92è\82·\82é\82É\82Í SetFrequency(tuner, ISDB_T, 23, 7*2) \82Æ\82µ\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 channel \82ª NULL (GetFrequency \82Ì\82Ý)
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô\82Ì\82½\82ß\90Ý\92è\95s\89Â (SetFrequency \82Ì\82Ý)
+ virtual status SetFrequency(ISDB isdb, uint32 index, uint32 channel, sint32 offset = 0) = 0;
+ virtual status GetFrequency(ISDB isdb, uint32 index, uint32 *channel, sint32 *offset = 0) const = 0;
+
+ // (ISDB-S)
+ // +----+------+---------+ +----+------+---------+ +----+------+---------+
+ // | ch | TP # | f (MHz) | | ch | TP # | f (MHz) | | ch | TP # | f (MHz) |
+ // +----+------+---------+ +----+------+---------+ +----+------+---------+
+ // | 0 | BS 1 | 1049.48 | | 12 | ND 2 | 1613.00 | | 24 | ND 1 | 1593.00 |
+ // | 1 | BS 3 | 1087.84 | | 13 | ND 4 | 1653.00 | | 25 | ND 3 | 1633.00 |
+ // | 2 | BS 5 | 1126.20 | | 14 | ND 6 | 1693.00 | | 26 | ND 5 | 1673.00 |
+ // | 3 | BS 7 | 1164.56 | | 15 | ND 8 | 1733.00 | | 27 | ND 7 | 1713.00 |
+ // | 4 | BS 9 | 1202.92 | | 16 | ND10 | 1773.00 | | 28 | ND 9 | 1753.00 |
+ // | 5 | BS11 | 1241.28 | | 17 | ND12 | 1813.00 | | 29 | ND11 | 1793.00 |
+ // | 6 | BS13 | 1279.64 | | 18 | ND14 | 1853.00 | | 30 | ND13 | 1833.00 |
+ // | 7 | BS15 | 1318.00 | | 19 | ND16 | 1893.00 | | 31 | ND15 | 1873.00 |
+ // | 8 | BS17 | 1356.36 | | 20 | ND18 | 1933.00 | | 32 | ND17 | 1913.00 |
+ // | 9 | BS19 | 1394.72 | | 21 | ND20 | 1973.00 | | 33 | ND19 | 1953.00 |
+ // | 10 | BS21 | 1433.08 | | 22 | ND22 | 2013.00 | | 34 | ND21 | 1993.00 |
+ // | 11 | BS23 | 1471.44 | | 23 | ND24 | 2053.00 | | 35 | ND23 | 2033.00 |
+ // +----+------+---------+ +----+------+---------+ +----+------+---------+
+ //
+ // (ISDB-T)
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ // | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) | | ch. | Ch. | f (MHz) |
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ // | 0 | 1 | 93+1/7 | | 23 | C24 | 231+1/7 | | 46 | C47 | 369+1/7 | | 69 | 19 | 509+1/7 | | 92 | 42 | 647+1/7 |
+ // | 1 | 2 | 99+1/7 | | 24 | C25 | 237+1/7 | | 47 | C48 | 375+1/7 | | 70 | 20 | 515+1/7 | | 93 | 43 | 653+1/7 |
+ // | 2 | 3 | 105+1/7 | | 25 | C26 | 243+1/7 | | 48 | C49 | 381+1/7 | | 71 | 21 | 521+1/7 | | 94 | 44 | 659+1/7 |
+ // | 3 | C13 | 111+1/7 | | 26 | C27 | 249+1/7 | | 49 | C50 | 387+1/7 | | 72 | 22 | 527+1/7 | | 95 | 45 | 665+1/7 |
+ // | 4 | C14 | 117+1/7 | | 27 | C28 | 255+1/7 | | 50 | C51 | 393+1/7 | | 73 | 23 | 533+1/7 | | 96 | 46 | 671+1/7 |
+ // | 5 | C15 | 123+1/7 | | 28 | C29 | 261+1/7 | | 51 | C52 | 399+1/7 | | 74 | 24 | 539+1/7 | | 97 | 47 | 677+1/7 |
+ // | 6 | C16 | 129+1/7 | | 29 | C30 | 267+1/7 | | 52 | C53 | 405+1/7 | | 75 | 25 | 545+1/7 | | 98 | 48 | 683+1/7 |
+ // | 7 | C17 | 135+1/7 | | 30 | C31 | 273+1/7 | | 53 | C54 | 411+1/7 | | 76 | 26 | 551+1/7 | | 99 | 49 | 689+1/7 |
+ // | 8 | C18 | 141+1/7 | | 31 | C32 | 279+1/7 | | 54 | C55 | 417+1/7 | | 77 | 27 | 557+1/7 | | 100 | 50 | 695+1/7 |
+ // | 9 | C19 | 147+1/7 | | 32 | C33 | 285+1/7 | | 55 | C56 | 423+1/7 | | 78 | 28 | 563+1/7 | | 101 | 51 | 701+1/7 |
+ // | 10 | C20 | 153+1/7 | | 33 | C34 | 291+1/7 | | 56 | C57 | 429+1/7 | | 79 | 29 | 569+1/7 | | 102 | 52 | 707+1/7 |
+ // | 11 | C21 | 159+1/7 | | 34 | C35 | 297+1/7 | | 57 | C58 | 435+1/7 | | 80 | 30 | 575+1/7 | | 103 | 53 | 713+1/7 |
+ // | 12 | C22 | 167+1/7 | | 35 | C36 | 303+1/7 | | 58 | C59 | 441+1/7 | | 81 | 31 | 581+1/7 | | 104 | 54 | 719+1/7 |
+ // | 13 | 4 | 173+1/7 | | 36 | C37 | 309+1/7 | | 59 | C60 | 447+1/7 | | 82 | 32 | 587+1/7 | | 105 | 55 | 725+1/7 |
+ // | 14 | 5 | 179+1/7 | | 37 | C38 | 315+1/7 | | 60 | C61 | 453+1/7 | | 83 | 33 | 593+1/7 | | 106 | 56 | 731+1/7 |
+ // | 15 | 6 | 185+1/7 | | 38 | C39 | 321+1/7 | | 61 | C62 | 459+1/7 | | 84 | 34 | 599+1/7 | | 107 | 57 | 737+1/7 |
+ // | 16 | 7 | 191+1/7 | | 39 | C40 | 327+1/7 | | 62 | C63 | 465+1/7 | | 85 | 35 | 605+1/7 | | 108 | 58 | 743+1/7 |
+ // | 17 | 8 | 195+1/7 | | 40 | C41 | 333+1/7 | | 63 | 13 | 473+1/7 | | 86 | 36 | 611+1/7 | | 109 | 59 | 749+1/7 |
+ // | 18 | 9 | 201+1/7 | | 41 | C42 | 339+1/7 | | 64 | 14 | 479+1/7 | | 87 | 37 | 617+1/7 | | 110 | 60 | 755+1/7 |
+ // | 19 | 10 | 207+1/7 | | 42 | C43 | 345+1/7 | | 65 | 15 | 485+1/7 | | 88 | 38 | 623+1/7 | | 111 | 61 | 761+1/7 |
+ // | 20 | 11 | 213+1/7 | | 43 | C44 | 351+1/7 | | 66 | 16 | 491+1/7 | | 89 | 39 | 629+1/7 | | 112 | 62 | 767+1/7 |
+ // | 21 | 12 | 219+1/7 | | 44 | C45 | 357+1/7 | | 67 | 17 | 497+1/7 | | 90 | 40 | 635+1/7 | +-----+-----+---------+
+ // | 22 | C23 | 225+1/7 | | 45 | C46 | 363+1/7 | | 68 | 18 | 503+1/7 | | 91 | 41 | 641+1/7 |
+ // +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+ +-----+-----+---------+
+ //
+ // C24\81`C27 \82Í\81A\83P\81[\83u\83\8b\83e\83\8c\83r\8bÇ\82É\82æ\82è\89º\8bL\82Ì\8eü\94g\90\94\82Å\91\97\90M\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+ // +-----+---------+
+ // | Ch. | f (MHz) |
+ // +-----+---------+
+ // | C24 | 233+1/7 |
+ // | C25 | 239+1/7 |
+ // | C26 | 245+1/7 |
+ // | C27 | 251+1/7 |
+ // +-----+---------+
+
+ // ----------
+ // \8eü\94g\90\94\8cë\8d·
+ // ----------
+
+ // [\8b@\94\] \8eü\94g\90\94\8cë\8d·\82ð\8eæ\93¾
+ // [\90à\96¾] \92l\82Ì\88Ó\96¡\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // \83N\83\8d\83b\83N\8eü\94g\90\94\8cë\8d·: clock/100 (ppm)
+ // \83L\83\83\83\8a\83A\8eü\94g\90\94\8cë\8d·: carrier (Hz)
+ // \95ú\91\97\94g\82Ì\8eü\94g\90\94\90¸\93x\82Í\8f\\95ª\82É\8d\82\82¢\89¼\92è\82·\82é\82Æ\81A\8cë\8d·\82ª\94\90¶\82·\82é\97v\91f\82Æ\82µ\82Ä\88È\89º\82Ì\82æ\82¤\82È\82à\82Ì\82ª\8dl\82¦\82ç\82ê\82Ü\82·\81B
+ // (ISDB-S) LNB \82Å\82Ì\8eü\94g\90\94\95Ï\8a·\90¸\93x / \89q\90¯\91¤ PLL-IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x / \95\9c\92² IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x
+ // (ISDB-T) \92n\8fã\91¤ PLL-IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x / \95\9c\92² IC \82É\90Ú\91±\82³\82ê\82Ä\82¢\82é\90U\93®\8eq\82Ì\90¸\93x
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 clock, carrier \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô
+ virtual status GetFrequencyOffset(ISDB isdb, uint32 tuner, sint32 *clock, sint32 *carrier) = 0;
+
+ // --------
+ // C/N\81EAGC
+ // --------
+
+ // [\8b@\94\] C/N \82Æ AGC \82ð\8eæ\93¾
+ // [\90à\96¾] C/N \82Í\92á\83\8c\83C\83e\83\93\83V\82Å\91ª\92è\82Å\82«\82é\82½\82ß\81A\83A\83\93\83e\83i\82Ì\8cü\82«\82ð\92²\90®\82·\82é\82Ì\82É\95Ö\97\98\82Å\82·\81B
+ // \92l\82Ì\88Ó\96¡\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // C/N : cn100/100 (dB)
+ // \8c»\8dÝ\82Ì AGC \92l : currentAgc
+ // \97\98\93¾\8dÅ\91å\8e\9e\82Ì AGC \92l: maxAgc
+ // currentAgc \82Ì\94Í\88Í\82Í 0 \82©\82ç maxAgc \82Ü\82Å\82Å\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 cn100, currentAgc, maxAgc \82Ì\82¢\82¸\82ê\82©\82ª NULL
+ // STATUS_TUNER_IS_SLEEP_ERROR \81¨ \83`\83\85\81[\83i\81[\82ª\8fÈ\93d\97Í\8fó\91Ô
+ virtual status GetCnAgc(ISDB isdb, uint32 tuner, uint32 *cn100, uint32 *currentAgc, uint32 *maxAgc) = 0;
+
+ // ----------------------
+ // RF Level (ISDB-T \82Ì\82Ý)
+ // ----------------------
+ virtual status GetRFLevel(uint32 tuner, float *level) = 0;
+
+ // -------------------
+ // TS-ID (ISDB-S \82Ì\82Ý)
+ // -------------------
+
+ // [\8b@\94\] TS-ID \82ð\90Ý\92è
+ // [\90à\96¾] \90Ý\92è\92l\82ª\95\9c\92²IC \82Ì\93®\8dì\82É\94½\89f\82³\82ê\82é\82Ü\82Å\8e\9e\8aÔ\82ª\8a|\82©\82è\82Ü\82·\81B
+ // GetLayerS() \82ð\8cÄ\82Ñ\8fo\82·\91O\82É\81AGetIdS() \82ð\8eg\82Á\82Ä\90Ø\82è\91Ö\82¦\82ª\8a®\97¹\82µ\82½\82±\82Æ\82ð\8am\94F\82µ\82Ä\82\82¾\82³\82¢\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢
+ virtual status SetIdS(uint32 tuner, uint32 id) = 0;
+
+ // [\8b@\94\] \8c»\8dÝ\8f\88\97\9d\92\86\82Ì TS-ID \82ð\8eæ\93¾
+ // [\90à\96¾] GetLayerS() \82Å\8eæ\93¾\82Å\82«\82é\83\8c\83C\83\84\8fî\95ñ\82Í\81A\82±\82Ì\8aÖ\90\94\82Å\8e¦\82³\82ê\82é TS-ID \82Ì\82à\82Ì\82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\81B\82Ü\82½\82Í\88ø\90\94 id \82ª NULL
+ virtual status GetIdS(uint32 tuner, uint32 *id) = 0;
+
+ // ------------
+ // \83G\83\89\81[\83\8c\81[\83g
+ // ------------
+
+ // \8aK\91w\83C\83\93\83f\83b\83N\83X
+ enum LayerIndex {
+ // ISDB-S
+ LAYER_INDEX_L = 0, // \92á\8aK\91w
+ LAYER_INDEX_H, // \8d\82\8aK\91w
+
+ // ISDB-T
+ LAYER_INDEX_A = 0, // A \8aK\91w
+ LAYER_INDEX_B, // B \8aK\91w
+ LAYER_INDEX_C // C \8aK\91w
+ };
+
+ // \8aK\91w\90\94
+ enum LayerCount {
+ // ISDB-S
+ LAYER_COUNT_S = LAYER_INDEX_H + 1,
+
+ // ISDB-T
+ LAYER_COUNT_T = LAYER_INDEX_C + 1
+ };
+
+ // \83G\83\89\81[\83\8c\81[\83g
+ struct ErrorRate {
+ uint32 Numerator, Denominator;
+ };
+
+ // [\8b@\94\] GetInnerErrorRate() \82Å\91Î\8fÛ\82Æ\82È\82é\8aK\91w\82ð\90Ý\92è
+ virtual status SetInnerErrorRateLayer(ISDB isdb, uint32 tuner, LayerIndex layerIndex) = 0;
+
+ // [\8b@\94\] \93à\95\84\8d\86\82Å\92ù\90³\82³\82ê\82½\83G\83\89\81[\83\8c\81[\83g\82ð\8eæ\93¾
+ virtual status GetInnerErrorRate(ISDB isdb, uint32 tuner, ErrorRate *errorRate) = 0;
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82³\82ê\82½\83G\83\89\81[\83\8c\81[\83g\82ð\8eæ\93¾
+ // [\90à\96¾] \91ª\92è\82É\8e\9e\8aÔ\82ª\8a|\82©\82è\82Ü\82·\82ª\81A\8eó\90M\95i\8e¿\82ð\90³\8am\82É\94c\88¬\82·\82é\82É\82Í C/N \82Å\82Í\82È\82\82±\82Ì\83G\83\89\81[\83\8c\81[\83g\82ð\8eQ\8dl\82É\82µ\82Ä\82\82¾\82³\82¢\81B
+ // \82Ð\82Æ\82Â\82Ì\96Ú\88À\82Æ\82µ\82Ä 2\81~10^-4 \88È\89º\82Å\82 \82ê\82Î\81A\83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\8cã\82É\82Ù\82Ú\83G\83\89\81[\83t\83\8a\81[\82É\82È\82é\82Æ\82¢\82í\82ê\82Ä\82¢\82Ü\82·\81B
+ // \83G\83\89\81[\83\8c\81[\83g\82Ì\8fW\8cv\92P\88Ê\82Í\8e\9f\82Ì\92Ê\82è\82Å\82·\81B
+ // ISDB-S: 1024 \83t\83\8c\81[\83\80
+ // ISDB-T: 32 \83t\83\8c\81[\83\80 (\83\82\81[\83h 1,2) / 8 \83t\83\8c\81[\83\80 (\83\82\81[\83h 3)
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner, isdb, layerIndex \82ª\94Í\88Í\8aO\81B\82Ü\82½\82Í errorRate \82ª NULL
+ virtual status GetCorrectedErrorRate(ISDB isdb, uint32 tuner, LayerIndex layerIndex, ErrorRate *errorRate) = 0;
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82³\82ê\82½\83G\83\89\81[\83\8c\81[\83g\82ð\8cv\8eZ\82·\82é\82½\82ß\82Ì\83G\83\89\81[\83J\83E\83\93\83^\82ð\8f\89\8aú\89»
+ // [\90à\96¾] \91S\8aK\91w\82Ì\83J\83E\83\93\83^\82ð\8f\89\8aú\89»\82µ\82Ü\82·\81B\93Á\92è\82Ì\8aK\91w\82Ì\83J\83E\83\93\83^\82ð\83\8a\83Z\83b\83g\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ virtual status ResetCorrectedErrorCount(ISDB isdb, uint32 tuner) = 0;
+
+ // [\8b@\94\] \83\8a\81[\83h\83\\83\8d\83\82\83\93\95\9c\8d\86\82Å\92ù\90³\82µ\82«\82ê\82È\82©\82Á\82½ TS \83p\83P\83b\83g\90\94\82ð\8eæ\93¾
+ // [\90à\96¾] 0xffffffff \82Ì\8e\9f\82Í 0x00000000 \82É\82È\82è\82Ü\82·\81B
+ // TS \83p\83P\83b\83g\82Ì 2nd Byte MSB \82ð\90\94\82¦\82Ä\82à\93¯\82¶\90\94\92l\82É\82È\82è\82Ü\82·\81B
+ // \82±\82Ì\83J\83E\83\93\83^\82Í DMA \93]\91\97\8aJ\8en\8e\9e\82É\8f\89\8aú\89»\82³\82ê\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO\81B\82Ü\82½\82Í\88ø\90\94 count \82ª NULL
+ virtual status GetErrorCount(ISDB isdb, uint32 tuner, uint32 *count) = 0;
+
+ // --------------------------
+ // TMCC\81E\83\8c\83C\83\84\81[\81E\83\8d\83b\83N\94»\92è
+ // --------------------------
+
+ // ISDB-S TMCC \8fî\95ñ
+ // (\8eQ\8dl) STD-B20 2.9 TMCC\8fî\95ñ\82Ì\8d\\90¬ \81` 2.11 TMCC\8fî\95ñ\82Ì\8dX\90V
+ struct TmccS {
+ uint32 Indicator; // \95Ï\8dX\8ew\8e¦ (5\83r\83b\83g)
+ uint32 Mode[4]; // \93`\91\97\83\82\81[\83hn (4\83r\83b\83g)
+ uint32 Slot[4]; // \93`\91\97\83\82\81[\83hn\82Ö\82Ì\8a\84\93\96\83X\83\8d\83b\83g\90\94 (6\83r\83b\83g)
+ // [\91\8a\91ÎTS\81^\83X\83\8d\83b\83g\8fî\95ñ\82Í\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ]
+ uint32 Id[8]; // \91\8a\91ÎTS\94Ô\8d\86n\82É\91Î\82·\82éTS ID (16\83r\83b\83g)
+ uint32 Emergency; // \8bN\93®\90§\8cä\90M\8d\86 (1\83r\83b\83g)
+ uint32 UpLink; // \83A\83b\83v\83\8a\83\93\83N\90§\8cä\8fî\95ñ (4\83r\83b\83g)
+ uint32 ExtFlag; // \8ag\92£\83t\83\89\83O (1\83r\83b\83g)
+ uint32 ExtData[2]; // \8ag\92£\97Ì\88æ (61\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-S \82Ì TMCC \8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 tmcc \82ª NULL
+ virtual status GetTmccS(uint32 tuner, TmccS *tmcc) = 0;
+
+ // ISDB-S \8aK\91w\8fî\95ñ
+ struct LayerS {
+ uint32 Mode [LAYER_COUNT_S]; // \93`\91\97\83\82\81[\83h (3\83r\83b\83g)
+ uint32 Count[LAYER_COUNT_S]; // \83_\83~\81[\83X\83\8d\83b\83g\82ð\8aÜ\82ß\82½\8a\84\93\96\83X\83\8d\83b\83g\90\94 (6\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-S \82Ì\83\8c\83C\83\84\8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 layerS \82ª NULL
+ virtual status GetLayerS(uint32 tuner, LayerS *layerS) = 0;
+
+ // ISDB-T TMCC \8fî\95ñ
+ // (\8eQ\8dl) STD-B31 3.15.6 TMCC\8fî\95ñ \81` 3.15.6.8 \83Z\83O\83\81\83\93\83g\90\94
+ struct TmccT {
+ uint32 System; // \83V\83X\83e\83\80\8e¯\95Ê (2\83r\83b\83g)
+ uint32 Indicator; // \93`\91\97\83p\83\89\83\81\81[\83^\90Ø\82è\91Ö\82¦\8ew\95W (4\83r\83b\83g)
+ uint32 Emergency; // \8bÙ\8b}\8cx\95ñ\95ú\91\97\97p\8bN\93®\83t\83\89\83O (1\83r\83b\83g)
+ // \83J\83\8c\83\93\83g\8fî\95ñ
+ uint32 Partial; // \95\94\95ª\8eó\90M\83t\83\89\83O (1\83r\83b\83g)
+ // \8aK\91w\8fî\95ñ
+ uint32 Mode [LAYER_COUNT_T]; // \83L\83\83\83\8a\83A\95Ï\92²\95û\8e® (3\83r\83b\83g)
+ uint32 Rate [LAYER_COUNT_T]; // \8fô\8d\9e\82Ý\95\84\8d\86\89»\97¦ (3\83r\83b\83g)
+ uint32 Interleave[LAYER_COUNT_T]; // \83C\83\93\83^\81[\83\8a\81[\83u\92· (3\83r\83b\83g)
+ uint32 Segment [LAYER_COUNT_T]; // \83Z\83O\83\81\83\93\83g\90\94 (4\83r\83b\83g)
+ // [\83l\83N\83X\83g\8fî\95ñ\82Í\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ]
+ uint32 Phase; // \98A\8c\8b\91\97\90M\88Ê\91\8a\95â\90³\97Ê (3\83r\83b\83g)
+ uint32 Reserved; // \83\8a\83U\81[\83u (12\83r\83b\83g)
+ };
+
+ // [\8b@\94\] ISDB-T \82Ì TMCC \8fî\95ñ\82ð\8eæ\93¾
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 tmcc \82ª NULL
+ virtual status GetTmccT(uint32 tuner, TmccT *tmcc) = 0;
+
+ // [\8b@\94\] ISDB-T \83\8d\83b\83N\94»\92è\82ð\8eæ\93¾
+ // [\90à\96¾] \83\8c\83C\83\84\82ª\91¶\8dÝ\82µ\81A\82È\82¨\82©\82Â\82»\82Ì\83\8c\83C\83\84\82ª\83G\83\89\81[\83t\83\8a\81[\82Å\82 \82é\82Æ\82«\82É true \82É\82È\82è\82Ü\82·\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 locked \82ª NULL
+// virtual status GetLockedT(uint32 tuner, bool locked[LAYER_COUNT_T]) = 0;
+
+ // [\8b@\94\] ISDB-T \91¤\82Ì\93ü\97Í\83A\83\93\83v\82Ì\93d\8c¹\90§\8cä
+ virtual status SetAmpPowerT(bool b) = 0;
+
+ // \8eó\90M\8aK\91w
+ enum LayerMask {
+ LAYER_MASK_NONE,
+
+ // ISDB-S
+ LAYER_MASK_L = 1 << LAYER_INDEX_L,
+ LAYER_MASK_H = 1 << LAYER_INDEX_H,
+
+ // ISDB-T
+ LAYER_MASK_A = 1 << LAYER_INDEX_A,
+ LAYER_MASK_B = 1 << LAYER_INDEX_B,
+ LAYER_MASK_C = 1 << LAYER_INDEX_C
+ };
+
+ // [\8b@\94\] \8eó\90M\8aK\91w\82Ì\90Ý\92è
+ // [\90à\96¾] ISDB-S \82Ì\92á\8aK\91w\82ð\8eó\90M\82µ\82È\82¢\82æ\82¤\82É\90Ý\92è\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+ // [\95Ô\92l] STATUS_DEVICE_IS_NOT_OPEN_ERROR \81¨ \83f\83o\83C\83X\82ª\83I\81[\83v\83\93\82³\82ê\82Ä\82¢\82È\82¢
+ // STATUS_INVALID_PARAM_ERROR \81¨ \88ø\90\94 tuner \82ª 1 \82æ\82è\91å\82«\82¢\82©\88ø\90\94 isdb \82ª\94Í\88Í\8aO
+ // \88ø\90\94 layerMask \82ª\94Í\88Í\8aO (SetLayerEnable \82Ì\82Ý)
+ // \88ø\90\94 layerMask \82ª NULL (GetLayerEnable \82Ì\82Ý)
+ virtual status SetLayerEnable(ISDB isdb, uint32 tuner, LayerMask layerMask) = 0;
+ virtual status GetLayerEnable(ISDB isdb, uint32 tuner, LayerMask *layerMask) const = 0;
+
+ // -------------
+ // TS \83s\83\93\83e\83X\83g
+ // -------------
+ enum TsPinMode {
+ TS_PIN_MODE_NORMAL,
+ TS_PIN_MODE_LOW,
+ TS_PIN_MODE_HIGH
+ };
+
+ struct TsPinsMode {
+ TsPinMode clock_data,
+ byte,
+ valid;
+ };
+
+ struct TsPinsLevel {
+ bool clock, // \83g\83O\83\8b\93®\8dì
+ data,
+ byte,
+ valid;
+ };
+
+ virtual status SetTsPinsMode (ISDB isdb, uint32 tuner, const TsPinsMode *mode ) = 0;
+ virtual status GetTsPinsLevel(ISDB isdb, uint32 tuner, TsPinsLevel *level) = 0;
+
+ virtual status GetTsSyncByte(ISDB isdb, uint32 tuner, uint8 *syncByte) = 0;
+
+ enum RamPinsMode {
+ RAM_PINS_MODE_NORMAL,
+ RAM_PINS_MODE_LOW,
+ RAM_PINS_MODE_HIGH
+ };
+
+ virtual status SetRamPinsMode(RamPinsMode mode) = 0;
+
+ // ------------------
+ // DMA \93]\91\97\97p\83o\83b\83t\83@
+ // ------------------
+
+ // \8e\9f\82Ì\8aÖ\90\94\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½\81BLockBuffer() \82ð\82²\97\98\97p\82\82¾\82³\82¢\81B
+ virtual status LockBuffer__Obsolated__(void *ptr, uint32 size, void **handle) = 0;
+ virtual status UnlockBuffer(void *handle) = 0;
+
+ struct BufferInfo {
+ uint64 Address; // \95¨\97\9d\83A\83h\83\8c\83X
+ uint32 Size; // \83T\83C\83Y
+ };
+
+ virtual status GetBufferInfo(void *handle, const BufferInfo **infoTable, uint32 *infoCount) = 0;
+
+ // --------
+ // DMA \93]\91\97
+ // --------
+
+ // [\8b@\94\] DMA \8aJ\8en\81E\92â\8e~\82Ì\90§\8cä
+ // [\90à\96¾] DMA \93]\91\97\82Í\91S\82 CPU \82ð\89î\8dÝ\82·\82é\82±\82Æ\82È\82\93®\8dì\82µ\82Ü\82·\81B
+ // GetTransferEnabled() \82Å true \82ª\93¾\82ç\82ê\82é\82Æ\82«\82É SetTransferEnabled(true ) \82Æ\82µ\82½\82è\81A
+ // GetTransferEnabled() \82Å false \82ª\93¾\82ç\82ê\82é\82Æ\82«\82É SetTransferEnabled(false) \82Æ\82·\82é\82Æ\83G\83\89\81[\82É\82È\82è\82Ü\82·\81B
+ //
+ // GetTransferEnabled() \82Å\8eæ\93¾\82Å\82«\82é\92l\82Í\81A\92P\82É SetTransferEnabled() \82Å\8dÅ\8cã\82É\90Ý\92è\82³\82ê\82½\92l\82Æ\93¯\82¶\82Å\82·\81B
+ // \93]\91\97\83J\83E\83\93\83^\82ª 0 \82É\82È\82é\82È\82Ç\81A\83n\81[\83h\83E\83F\83A\91¤\82Å DMA \93]\91\97\82ª\8e©\93®\93I\82É\92â\8e~\82·\82é\97v\88ö\82ª\82¢\82\82Â\82©\82 \82è\82Ü\82·\82ª\81A
+ // \82»\82Ì\8fê\8d\87\82Å\82à GetTransferEnabled() \82Å\93¾\82ç\82ê\82é\92l\82Í\95Ï\82í\82è\82Ü\82¹\82ñ\81B
+ virtual status SetTransferPageDescriptorAddress(ISDB isdb, uint32 tunerIndex, uint64 pageDescriptorAddress) = 0;
+ virtual status SetTransferEnabled (ISDB isdb, uint32 tunerIndex, bool enabled) = 0;
+ virtual status GetTransferEnabled (ISDB isdb, uint32 tunerIndex, bool *enabled) const = 0;
+
+ // resetError \82Í TS \83G\83\89\81[\83p\83P\83b\83g\82Ì\83\8a\83Z\83b\83g\82Å\82·\81B\8f«\97\88\93I\82É\82Í\95Ê\8aÖ\90\94\82É\88Ú\93®\82µ\82Ü\82·\81B
+ virtual status SetTransferTestMode(ISDB isdb, uint32 tunerIndex, bool testMode = false, uint16 initial = 0, bool not = false/*, bool resetError = false*/) = 0;
+
+ struct TransferInfo {
+ bool Busy;
+ uint32 Status; // 4\83r\83b\83g
+ bool InternalFIFO_A_Overflow,
+ InternalFIFO_A_Underflow;
+ bool ExternalFIFO_Overflow;
+ uint32 ExternalFIFO_MaxUsedBytes; // ExternalFIFO_Overflow \82ª false \82Ì\8fê\8d\87\82Ì\82Ý\97L\8cø
+ bool InternalFIFO_B_Overflow,
+ InternalFIFO_B_Underflow;
+ };
+
+ virtual status GetTransferInfo(ISDB isdb, uint32 tunerIndex, TransferInfo *transferInfo) = 0;
+
+ // ---------------------
+ // 0.96 \82Å\92Ç\89Á\82³\82ê\82½\8aÖ\90\94
+ // ---------------------
+
+ enum TransferDirection { // DMA \82Ì\93]\91\97\95û\8cü
+ TRANSFER_DIRECTION_WRITE = 1 << 0, // PCI \83f\83o\83C\83X\82ª\83\81\83\82\83\8a\82É\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ
+ TRANSFER_DIRECTION_READ = 1 << 1, // PCI \83f\83o\83C\83X\82ª\83\81\83\82\83\8a\82Ì\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ
+ TRANSFER_DIRECTION_WRITE_READ = TRANSFER_DIRECTION_WRITE | TRANSFER_DIRECTION_READ
+ };
+
+ // [\8b@\94\] \83\81\83\82\83\8a\97Ì\88æ\82ð\95¨\97\9d\83\81\83\82\83\8a\82É\8cÅ\92è\82·\82é
+ // [\90à\96¾] DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82Í DMA \93]\91\97\82ð\8aJ\8en\82·\82é\91O\82É\95¨\97\9d\83\81\83\82\83\8a\82É\8cÅ\92è\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+ // ptr \82Æ size \82Å\83\81\83\82\83\8a\97Ì\88æ\82ð\8ew\92è\82µ\81Adirection \82Å DMA \93]\91\97\95û\8cü\82ð\8ew\92è\82µ\82Ü\82·\81B
+ // handle \82Å\95Ô\82³\82ê\82½\83|\83C\83\93\83^\82Í UnlockBuffer(), SyncBufferCpu(), SyncBufferDevice() \82Å\8eg\97p\82µ\82Ü\82·\81B
+ virtual status LockBuffer(void *ptr, uint32 size, TransferDirection direction, void **handle) = 0;
+
+ // [\8b@\94\] CPU \83L\83\83\83b\83V\83\85\82Æ DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82Ì\93¯\8aú\82ð\8eæ\82é
+ // [\90à\96¾] \89º\8bL\82É\8bL\8dÚ\82·\82é\95s\90®\8d\87\82ª\8bN\82±\82ç\82È\82¢\82æ\82¤\82É\81A\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82ñ\82Å\93¯\8aú\82ð\8eæ\82é\95K\97v\90«\82ª\82 \82è\82Ü\82·\81B
+ // (\83P\81[\83X1)
+ // 1. CPU \82ª DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ
+ // 2. \8f\91\82«\8d\9e\82Ü\82ê\82½\83f\81[\83^\82Í CPU \83L\83\83\83b\83V\83\85\8fã\82É\91¶\8dÝ\82·\82é\82¾\82¯\82Å DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\82Í\96¢\82¾\8f\91\82«\8d\9e\82Ü\82ê\82Ä\82¢\82È\82¢
+ // 3. PCI \83f\83o\83C\83X\82ª DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ
+ // 4. CPU \82ª\83L\83\83\83b\83V\83\85\8fã\82É\91¶\8dÝ\82·\82é\83f\81[\83^\82ð DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\8f\91\82«\8d\9e\82Þ (\95s\90®\8d\87\94\90¶)
+ // \81¦\95s\90®\8d\87\82ª\94\90¶\82µ\82È\82¢\82æ\82¤\82É 2 \82Ì\8cã\82É\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82ñ\82Å\82\82¾\82³\82¢\81B
+ //
+ // (\83P\81[\83X2)
+ // 1. PCI \83f\83o\83C\83X\82ª DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ
+ // 2. CPU \82ª\93]\91\97\97p\83\81\83\82\83\8a\82©\82ç\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ
+ // 3. \93Ç\82Ý\8d\9e\82ñ\82¾\83f\81[\83^\82Í CPU \82Ì\83L\83\83\83b\83V\83\85\82É\95Û\91¶\82³\82ê\82é
+ // 4. PCI \83f\83o\83C\83X\82ª DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\81u\90V\82µ\82¢\81v\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ
+ // 5. CPU \82ª\93]\91\97\97p\83\81\83\82\83\8a\82©\82ç\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ
+ // 6. CPU \82Í DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\82 \82é\81u\90V\82µ\82¢\81v\83f\81[\83^\82Å\82Í\82È\82\81A\83L\83\83\83b\83V\83\85\82³\82ê\82½\8cÃ\82¢\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ (\95s\90®\8d\87\94\90¶)
+ // \81¦\95s\90®\8d\87\82ª\94\90¶\82µ\82È\82¢\82æ\82¤\82É 5 \82Ì\91O\82É\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82ñ\82Å\82\82¾\82³\82¢\81B
+ virtual status SyncBufferCpu(void *handle) = 0;
+
+ // [\8b@\94\] I/O \83L\83\83\83b\83V\83\85\82Æ DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82Ì\93¯\8aú\82ð\8eæ\82é
+ // [\90à\96¾] \89º\8bL\82É\8bL\8dÚ\82·\82é\95s\90®\8d\87\82ª\8bN\82±\82ç\82È\82¢\82æ\82¤\82É\81A\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82ñ\82Å\93¯\8aú\82ð\8eæ\82é\95K\97v\90«\82ª\82 \82è\82Ü\82·\81B
+ // 1. PCI \83f\83o\83C\83X\82ª DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ\82½\82ß\82É\83p\83P\83b\83g\82ð\91\97\8fo\82·\82é
+ // 2. \83p\83P\83b\83g\82ð\8eó\82¯\8eæ\82Á\82½\83f\83C\83o\83X\82Í\8cã\82Å\83f\81[\83^\82ð\8e\9f\82Ì\83f\83o\83C\83X\82É\91\97\8fo\82·\82é\82½\82ß\81A\8e©\90g\82Å\83f\81[\83^\82ð\83L\83\83\83b\83V\83\85\82·\82é
+ // 3. \82æ\82Á\82Ä\83f\81[\83^\82Í\96¢\82¾ DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82É\8f\91\82«\8d\9e\82Ü\82ê\82Ä\82¢\82È\82¢
+ // 4. CPU \82Í PCI \83f\83o\83C\83X\82ª\81u\93]\91\97\8fI\97¹\81i\81\81\83p\83P\83b\83g\91\97\8fo\8fI\97¹\81j\81v\82Å\82 \82é\82±\82Æ\82ð\8am\94F\82·\82é
+ // 5. DMA \93]\91\97\97p\83\81\83\82\83\8a\97Ì\88æ\82©\82ç\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ (\95s\90®\8d\87\94\90¶)
+ // \81¦\95s\90®\8d\87\82ª\94\90¶\82µ\82È\82¢\82æ\82¤\82É 5 \82Ì\91O\82É\82±\82Ì\8aÖ\90\94\82ð\8cÄ\82ñ\82Å\82\82¾\82³\82¢\81B
+ virtual status SyncBufferIo(void *handle) = 0;
+
+ protected:
+ virtual ~Device() {}
+ };
+
+ enum Status {
+ // \83G\83\89\81[\82È\82µ
+ STATUS_OK,
+
+ // \88ê\94Ê\93I\82È\83G\83\89\81[
+ STATUS_GENERAL_ERROR = (1)*0x100,
+ STATUS_NOT_IMPLIMENTED,
+ STATUS_INVALID_PARAM_ERROR,
+ STATUS_OUT_OF_MEMORY_ERROR,
+ STATUS_INTERNAL_ERROR,
+
+ // \83o\83X\83N\83\89\83X\82Ì\83G\83\89\81[
+ STATUS_WDAPI_LOAD_ERROR = (2)*256, // wdapi####.dll \82ª\83\8d\81[\83h\82Å\82«\82È\82¢ [#### \82Í\83o\81[\83W\83\87\83\93\94Ô\8d\86]
+ STATUS_ALL_DEVICES_MUST_BE_DELETED_ERROR,
+
+ // \83f\83o\83C\83X\83N\83\89\83X\82Ì\83G\83\89\81[
+ STATUS_PCI_BUS_ERROR = (3)*0x100,
+ STATUS_CONFIG_REVISION_ERROR,
+ STATUS_FPGA_VERSION_ERROR,
+ STATUS_PCI_BASE_ADDRESS_ERROR,
+ STATUS_FLASH_MEMORY_ERROR,
+
+ STATUS_DCM_LOCK_TIMEOUT_ERROR,
+ STATUS_DCM_SHIFT_TIMEOUT_ERROR,
+
+ STATUS_POWER_RESET_ERROR,
+ STATUS_I2C_ERROR,
+ STATUS_TUNER_IS_SLEEP_ERROR,
+
+ STATUS_PLL_OUT_OF_RANGE_ERROR,
+ STATUS_PLL_LOCK_TIMEOUT_ERROR,
+
+ STATUS_VIRTUAL_ALLOC_ERROR,
+ STATUS_DMA_ADDRESS_ERROR,
+ STATUS_BUFFER_ALREADY_ALLOCATED_ERROR,
+
+ STATUS_DEVICE_IS_ALREADY_OPEN_ERROR,
+ STATUS_DEVICE_IS_NOT_OPEN_ERROR,
+
+ STATUS_BUFFER_IS_IN_USE_ERROR,
+ STATUS_BUFFER_IS_NOT_ALLOCATED_ERROR,
+
+ STATUS_DEVICE_MUST_BE_CLOSED_ERROR,
+
+ // WinDriver \8aÖ\98A\82Ì\83G\83\89\81[
+ STATUS_WD_DriverName_ERROR = (4)*0x100,
+
+ STATUS_WD_Open_ERROR,
+ STATUS_WD_Close_ERROR,
+
+ STATUS_WD_Version_ERROR,
+ STATUS_WD_License_ERROR,
+
+ STATUS_WD_PciScanCards_ERROR,
+
+ STATUS_WD_PciConfigDump_ERROR,
+
+ STATUS_WD_PciGetCardInfo_ERROR,
+ STATUS_WD_PciGetCardInfo_Bus_ERROR,
+ STATUS_WD_PciGetCardInfo_Memory_ERROR,
+
+ STATUS_WD_CardRegister_ERROR,
+ STATUS_WD_CardUnregister_ERROR,
+
+ STATUS_WD_CardCleanupSetup_ERROR,
+
+ STATUS_WD_DMALock_ERROR,
+ STATUS_WD_DMAUnlock_ERROR,
+
+ STATUS_WD_DMASyncCpu_ERROR,
+ STATUS_WD_DMASyncIo_ERROR,
+
+ // ROM
+ STATUS_ROM_ERROR = (5)*0x100,
+ STATUS_ROM_TIMEOUT
+ };
+}
+}
+
+#endif
--- /dev/null
+#ifndef _EX_Buffer_H\r
+#define _EX_Buffer_H\r
+\r
+#include "Prefix.h"\r
+#include "EARTH_PT3.h"\r
+#include "EX_Utility.h"\r
+#include "OS_Memory.h"\r
+#include <vector>\r
+\r
+namespace EARTH {\r
+namespace EX {\r
+ class Buffer {\r
+ public:\r
+ Buffer(PT::Device *device) : mDevice(device)\r
+ {\r
+ for (uint32 i=0; i<sizeof(mInfo)/sizeof(*mInfo); i++) {\r
+ Info *info = &mInfo[i];\r
+ info->memory = NULL;\r
+ info->ptr = NULL;\r
+ info->size = 0;\r
+ }\r
+ }\r
+\r
+ ~Buffer()\r
+ {\r
+ Free();\r
+ }\r
+\r
+ status Alloc(uint32 blockSize, uint32 blockCount, bool loop = true)\r
+ {\r
+ status status;\r
+ \r
+ status = AllocMemory(blockSize, blockCount);\r
+ if (status) return status;\r
+\r
+ BuildPageDescriptor(loop);\r
+\r
+ status = mDevice->SyncBufferCpu(mInfo[Index_Page].physicals[0].handle);\r
+ if (status) return status;\r
+\r
+ return status;\r
+ }\r
+\r
+ status Free()\r
+ {\r
+ status status;\r
+ status = FreeMemory();\r
+ if (status) return status;\r
+\r
+ return status;\r
+ }\r
+\r
+ status SyncCpu(uint32 blockIndex)\r
+ {\r
+ return mDevice->SyncBufferCpu(mInfo[Index_TS].physicals.at(blockIndex).handle);\r
+ }\r
+\r
+ status SyncIo(uint32 blockIndex)\r
+ {\r
+ return mDevice->SyncBufferIo(mInfo[Index_TS].physicals.at(blockIndex).handle);\r
+ }\r
+\r
+ void *Ptr(uint32 blockIndex)\r
+ {\r
+ Info *info = &mInfo[Index_TS];\r
+ uint8 *ptr = static_cast<uint8 *>(info->ptr);\r
+ ptr += info->blockSize * blockIndex;\r
+ return ptr;\r
+ }\r
+\r
+ uint64 PageDescriptorAddress()\r
+ {\r
+ _ASSERT(mInfo[Index_Page].physicals[0].bufferInfo);\r
+ uint64 address = mInfo[Index_Page].physicals[0].bufferInfo[0].Address;\r
+\r
+ return address;\r
+ }\r
+\r
+ protected:\r
+ enum Index {\r
+ Index_TS, // TS \83f\81[\83^\97Ì\88æ\r
+ Index_Page, // \83y\81[\83W\8bL\8fq\8eq\97Ì\88æ\r
+ Index_Count\r
+ };\r
+\r
+ struct Physical {\r
+ void *handle;\r
+ const PT::Device::BufferInfo *bufferInfo;\r
+ uint32 bufferCount;\r
+ };\r
+\r
+ struct Info {\r
+ OS::Memory *memory;\r
+ void *ptr;\r
+ uint32 size;\r
+ uint32 blockSize;\r
+ uint32 blockCount;\r
+ std::vector<Physical> physicals;\r
+ };\r
+\r
+ PT::Device *const mDevice;\r
+ Info mInfo[Index_Count];\r
+\r
+ status AllocMemory(uint32 blockSize, uint32 blockCount)\r
+ {\r
+ status status = PT::STATUS_OK;\r
+\r
+ // TS \83f\81[\83^\97Ì\88æ\82ð\8am\95Û\82·\82é\r
+ status = AllocMemory(Index_TS, blockSize , blockCount);\r
+ if (status) return status;\r
+\r
+ // \83y\81[\83W\8bL\8fq\8eq\97Ì\88æ\82ð\8am\95Û\82·\82é\r
+ // \8bL\8fq\8eq\82Ì\83T\83C\83Y\82Í 20 \83o\83C\83g\82È\82Ì\82Å\81A4096 \83o\83C\83g\82Ì\97Ì\88æ\82É\8d\\92z\82Å\82«\82é\8bL\8fq\8eq\82Ì\90\94\82Í 204 \8cÂ\82Å\82 \82é\81B\r
+ uint32 pageCount = (mInfo[Index_TS].size / OS::Memory::PAGE_SIZE + 203) / 204;\r
+ status = AllocMemory(Index_Page, OS::Memory::PAGE_SIZE * pageCount, 1);\r
+ if (status) return status;\r
+\r
+ return status;\r
+ }\r
+\r
+ status AllocMemory(Index index, uint32 blockSize, uint32 blockCount)\r
+ {\r
+ status status = PT::STATUS_OK;\r
+\r
+ _ASSERT(index < Index_Count);\r
+ Info *info = &mInfo[index];\r
+\r
+ // \83\81\83\82\83\8a\82ð\8am\95Û\82·\82é\r
+ uint32 size = blockSize * blockCount;\r
+\r
+ _ASSERT(info->memory == NULL);\r
+ info->memory = new OS::Memory(size);\r
+ if (info->memory == NULL) return PT::STATUS_OUT_OF_MEMORY_ERROR;\r
+\r
+ uint8 *ptr = static_cast<uint8 *>(info->memory->Ptr());\r
+ info->ptr = ptr;\r
+ info->size = size;\r
+ info->blockSize = blockSize;\r
+ info->blockCount = blockCount;\r
+ if (ptr == NULL) return PT::STATUS_OUT_OF_MEMORY_ERROR;\r
+ \r
+ Physical block;\r
+ block.handle = NULL;\r
+ block.bufferInfo = NULL;\r
+ block.bufferCount = 0;\r
+\r
+ // DMA \93]\91\97\82ª\82Å\82«\82é\82æ\82¤\82É\83u\83\8d\83b\83N\96\88\82É\95¨\97\9d\83\81\83\82\83\8a\82É\8cÅ\92è\82·\82é\r
+ PT::Device::TransferDirection direction = (index == Index_TS) ?\r
+ PT::Device::TRANSFER_DIRECTION_WRITE : PT::Device::TRANSFER_DIRECTION_READ;\r
+\r
+ uint32 offset = 0;\r
+ for (uint32 i=0; i<blockCount; i++) {\r
+ status = mDevice->LockBuffer(ptr + offset, blockSize, direction, &block.handle);\r
+ if (U::Error(L"Device::LockBuffer()", status)) return status;\r
+\r
+ status = mDevice->GetBufferInfo(block.handle, &block.bufferInfo, &block.bufferCount);\r
+ if (U::Error(L"Device::GetBufferInfo()", status)) return status;\r
+\r
+ info->physicals.push_back(block);\r
+\r
+ offset += blockSize;\r
+ }\r
+\r
+ return status;\r
+ }\r
+\r
+ status FreeMemory()\r
+ {\r
+ status status = PT::STATUS_OK;\r
+\r
+ for (uint32 i=0; i<sizeof(mInfo)/sizeof(*mInfo); i++) {\r
+ Info *info = &mInfo[i];\r
+ std::vector<Physical> &physicals = info->physicals;\r
+ for (uint32 i=0; i<physicals.size(); i++) {\r
+ Physical *block = &physicals[i];\r
+ if (block->handle) {\r
+ status = mDevice->UnlockBuffer(block->handle);\r
+ if (U::Error(L"Device::UnlockBuffer()", status)) return status;\r
+ }\r
+ }\r
+ physicals.clear();\r
+\r
+ if (info->memory) {\r
+ delete_(info->memory);\r
+ info->memory = NULL;\r
+ info->ptr = NULL;\r
+ info->size = 0;\r
+ }\r
+ }\r
+\r
+ return status;\r
+ }\r
+\r
+ // \82±\82Ì\83T\83\93\83v\83\8b\82Å\82Í 4096 \83o\83C\83g\82É\82Â\82« 1\82Â\82Ì\8bL\8fq\8eq\82ð\8d\\92z\82µ\82Ä\82¢\82Ü\82·\81B\r
+ // OS::Memory \82Å\8am\95Û\82·\82é\83\81\83\82\83\8a\83T\83C\83Y\82Í 4096 \82Ì\94{\90\94\82Å\81AOS::Memory\r
+ // \82Å\8eæ\93¾\82Å\82«\82é\89¼\91z\83A\83h\83\8c\83X\82à 4096 \83o\83C\83g\8b«\8aE\82É\82È\82Á\82Ä\82¢\82é\82Ì\82Å\81A\r
+ // FPGA.txt \82É\8bL\8fq\82³\82ê\82Ä\82¢\82é\81u4GB \82ð\8c×\82¢\82¾\83y\81[\83W\97Ì\88æ\82Í 2\82Â\82É\95ª\8a\84\82·\82é\81v\r
+ // \8f\88\97\9d\82Í\8dl\97¶\82·\82é\95K\97v\82ª\82È\82\82È\82è\82Ü\82·\81B\r
+ void BuildPageDescriptor(bool loop)\r
+ {\r
+ void *pagePtr = mInfo[Index_Page].ptr;\r
+ std::vector<Physical> &pagePhysicals = mInfo[Index_Page].physicals;\r
+ const PT::Device::BufferInfo *pageInfo = pagePhysicals[0].bufferInfo;\r
+\r
+ uint64 pageAddress = pageInfo->Address;\r
+ uint32 pageSize = pageInfo->Size;\r
+ pageInfo++;\r
+\r
+ // \83\8b\81[\83v\97p\82É\90æ\93ª\82Ì\95¨\97\9d\83A\83h\83\8c\83X\82ð\95Û\91¶\82µ\82Ä\82¨\82\r
+ uint64 loopPageAddress = pageAddress;\r
+\r
+ void *prevPagePtr = NULL;\r
+\r
+ std::vector<Physical> &tsPhysicals = mInfo[Index_TS].physicals;\r
+ for (uint32 i=0; i<tsPhysicals.size(); i++) {\r
+ Physical *physical = &tsPhysicals[i];\r
+ const PT::Device::BufferInfo *tsInfo = physical->bufferInfo;\r
+ uint32 tsCount = physical->bufferCount;\r
+\r
+ for (uint32 j=0; j<tsCount; j++) {\r
+ uint64 tsAddress = tsInfo->Address;\r
+ uint32 tsSize = tsInfo->Size;\r
+ tsInfo++;\r
+\r
+ _ASSERT((tsSize % OS::Memory::PAGE_SIZE) == 0);\r
+ for (uint32 k=0; k<tsSize/OS::Memory::PAGE_SIZE; k++) {\r
+ // \8ec\82è\82ª 20 \83o\83C\83g\96¢\96\9e\82©\82Ç\82¤\82©\82ð\83`\83F\83b\83N\r
+ if (pageSize < 20) {\r
+ // \8ec\82è\95\94\95ª\82ð\83X\83L\83b\83v\r
+ pagePtr = static_cast<uint8 *>(pagePtr) + pageSize;\r
+\r
+ // \83A\83h\83\8c\83X\82Æ\83T\83C\83Y\82ð\8dX\90V\r
+ pageAddress = pageInfo->Address;\r
+ pageSize = pageInfo->Size;\r
+ pageInfo++;\r
+ }\r
+\r
+ // \91O\82Ì\8bL\8fq\8eq\82ª\82 \82ê\82Î\81A\8d¡\82Ì\8bL\8fq\8eq\82Æ\82Â\82È\82°\82é\r
+ if (prevPagePtr) {\r
+ LinkPageDescriptor(pageAddress, prevPagePtr);\r
+ }\r
+\r
+ // \8d¡\82Ì\8bL\8fq\8eq\83|\83C\83\93\83^\82ð\95Û\91¶\82·\82é\r
+ prevPagePtr = pagePtr;\r
+\r
+ // \8bL\8fq\8eq\82ð\8d\\92z\82·\82é (nextAddress \82Í\8c»\8e\9e\93_\82Å\82Í\82í\82©\82ç\82È\82¢\82½\82ß 0 \82É\82µ\82Ä\82¨\82)\r
+ WritePageDescriptor(tsAddress, OS::Memory::PAGE_SIZE, 0, &pagePtr);\r
+\r
+ tsAddress += OS::Memory::PAGE_SIZE;\r
+\r
+ pageAddress += 20;\r
+ pageSize -= 20;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (prevPagePtr) {\r
+ if (loop) {\r
+ // \96\96\94ö\82©\82ç\90æ\93ª\82Ö\83\8b\81[\83v\82³\82¹\82é\r
+ LinkPageDescriptor(loopPageAddress, prevPagePtr);\r
+ } else {\r
+ // \96\96\94ö\82Å DMA \93]\91\97\82ð\8fI\97¹\82³\82¹\82é\r
+ LinkPageDescriptor(1, prevPagePtr);\r
+ }\r
+ }\r
+ }\r
+\r
+ void WritePageDescriptor(uint64 address, uint32 size, uint64 nextAddress, void **ptr_)\r
+ {\r
+ _ASSERT(ptr_);\r
+ uint8 *ptr = static_cast<uint8 *>(*ptr_);\r
+ _ASSERT(ptr);\r
+\r
+ *reinterpret_cast<uint64 *>(ptr + 0) = address | 7; // [2:0] \82Í\96³\8e\8b\82³\82ê\82é\r
+ *reinterpret_cast<uint32 *>(ptr + 8) = size | 7; // [2:0] \82Í\96³\8e\8b\82³\82ê\82é\r
+ *reinterpret_cast<uint64 *>(ptr + 12) = nextAddress | 2; // [1 ] \82Í\96³\8e\8b\82³\82ê\82é\r
+\r
+ *ptr_ = ptr + 20;\r
+ }\r
+\r
+ void LinkPageDescriptor(uint64 nextAddress, void *ptr_)\r
+ {\r
+ _ASSERT(ptr_);\r
+ uint8 *ptr = static_cast<uint8 *>(ptr_);\r
+ _ASSERT(ptr);\r
+\r
+ *reinterpret_cast<uint64 *>(ptr + 12) = nextAddress | 2; // [1] \82Í\96³\8e\8b\82³\82ê\82é\r
+ }\r
+ };\r
+}\r
+}\r
+\r
+#endif\r
+\r
--- /dev/null
+#ifndef _EX_Utility_H\r
+#define _EX_Utility_H\r
+\r
+#include "Prefix.h"\r
+#include "EARTH_PT3.h"\r
+\r
+namespace EARTH {\r
+namespace EX {\r
+ class U {\r
+ public:\r
+ static bool Error(const wchar_t *function, status status)\r
+ {\r
+ bool error = (status != PT::STATUS_OK);\r
+#if 0\r
+ if (error) {\r
+ ::wprintf(L"\81\9a\83G\83\89\81[\82ª\94\90¶\82µ\82Ü\82µ\82½\81B%s (0x%08x)\n", function, status);\r
+ }\r
+#endif\r
+ return error;\r
+ }\r
+\r
+ static sint32 GetNumber(uint32 maxNumber)\r
+ {\r
+ bool done = false;\r
+ uint32 number = 0;\r
+#if 0\r
+ do {\r
+ wint_t wint = ::_getwch();\r
+ if (wint == L'\03') ::exit(-1);\r
+\r
+ const wchar_t *string = L"0123456789";\r
+ const wchar_t *ptr = ::wcschr(string, wint);\r
+ if (ptr) {\r
+ number = static_cast<uint32>(ptr - string);\r
+ if (number <= maxNumber) {\r
+ ::_putch(wint);\r
+ ::wprintf(L"\n");\r
+ done = true;\r
+ }\r
+ }\r
+ } while (done == false);\r
+#endif\r
+\r
+ return number;\r
+ }\r
+ };\r
+}\r
+}\r
+\r
+#endif\r
--- /dev/null
+#ifndef _OS_Memory_H
+#define _OS_Memory_H
+
+#include "Prefix.h"
+#include <Windows.h>
+
+namespace EARTH {
+namespace OS {
+ class Memory {
+ public:
+ enum {
+ PAGE_SIZE = (4)*1024
+ };
+
+ Memory(size_t size)
+ {
+ _ASSERT((size % PAGE_SIZE) == 0);
+ mPtr = ::VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+ }
+
+ ~Memory()
+ {
+ if (mPtr) {
+ BOOL b = ::VirtualFree(mPtr, 0, MEM_RELEASE);
+ if (b) {
+ mPtr = NULL;
+ }
+ _ASSERT(b);
+ }
+ }
+
+ void *Ptr() const
+ {
+ return mPtr;
+ }
+
+ protected:
+ void *mPtr;
+ };
+}
+}
+
+#endif
--- /dev/null
+#ifndef _Prefix_H\r
+#define _Prefix_H\r
+\r
+#include <crtdbg.h>\r
+#include "Prefix_Bit.h"\r
+#include "Prefix_Integer.h"\r
+\r
+#define delete_(p) { delete p; p = NULL; }\r
+\r
+#define CHECK_STATUS do { if (status) return status; } while (false)\r
+\r
+#endif\r
--- /dev/null
+#ifndef _Prefix_Bit_H
+#define _Prefix_Bit_H
+
+#define BIT_1( b0) static_cast<uint32>((b0 )<< 0 )
+#define BIT_2( b1,b0) static_cast<uint32>((b1 )<< 1 | BIT_1 ( b0))
+#define BIT_3( b2,b1,b0) static_cast<uint32>((b2 )<< 2 | BIT_2 ( b1,b0))
+#define BIT_4( b3,b2,b1,b0) static_cast<uint32>((b3 )<< 3 | BIT_3 ( b2,b1,b0))
+#define BIT_5( b4,b3,b2,b1,b0) static_cast<uint32>((b4 )<< 4 | BIT_4 ( b3,b2,b1,b0))
+#define BIT_6( b5,b4,b3,b2,b1,b0) static_cast<uint32>((b5 )<< 5 | BIT_5 ( b4,b3,b2,b1,b0))
+#define BIT_7( b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b6 )<< 6 | BIT_6 ( b5,b4,b3,b2,b1,b0))
+#define BIT_8( b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b7 )<< 7 | BIT_7 ( b6,b5,b4,b3,b2,b1,b0))
+#define BIT_9( b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b8 )<< 8 | BIT_8 ( b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_10( b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b9 )<< 9 | BIT_9 ( b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_11( b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b10)<<10 | BIT_10( b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_12( b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b11)<<11 | BIT_11( b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_13( b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b12)<<12 | BIT_12( b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_14( b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b13)<<13 | BIT_13( b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_15( b14,b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b14)<<14 | BIT_14( b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+#define BIT_16(b15,b14,b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) static_cast<uint32>((b15)<<15 | BIT_15(b14,b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0))
+
+#define BIT_SHIFT_MASK(value, shift, mask) (((value) >> (shift)) & ((1<<(mask))-1))
+
+#endif
--- /dev/null
+#ifndef _Prefix_Integer_H
+#define _Prefix_Integer_H
+
+namespace EARTH {
+ typedef signed char sint8;
+ typedef unsigned char uint8;
+
+ typedef signed short sint16;
+ typedef unsigned short uint16;
+
+ typedef signed long sint32;
+ typedef unsigned long uint32;
+
+ typedef signed long long sint64;
+ typedef unsigned long long uint64;
+
+ typedef signed long status;
+}
+
+#endif
--- /dev/null
+//
+// Tuner.cpp
+//
+
+#include "Tuner.h"
+
+namespace ry0
+{
+namespace device
+{
+
+const char *Tuner::name()
+{
+ return NULL;
+}
+
+Tuner::Type Tuner::type()
+{
+ return TYPE_NA;
+}
+
+Tuner::LnbPower Tuner::lnbPower()
+{
+ return LNB_POWER_OFF;
+}
+
+bool Tuner::getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc)
+{
+ return false;
+}
+
+} // device
+} // ry0
+
+
--- /dev/null
+//\r
+// Tuner.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_TUNER_H__\r
+#define __RY0_DEVICE_TUNER_H__\r
+\r
+#include <stdint.h>\r
+#include <stdio.h>\r
+#include "keys.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+\r
+//\r
+static const uint32_t MAX_DEVICES = 32;\r
+static const uint32_t MAX_TUNERS = MAX_DEVICES * 4;\r
+\r
+class Tuner\r
+{\r
+public:\r
+\r
+ enum Type\r
+ {\r
+ TYPE_NA = 0,\r
+ ISDB_S = 1,\r
+ ISDB_T = 2\r
+ };\r
+\r
+ // LNB Power\r
+ enum LnbPower\r
+ {\r
+ LNB_POWER_OFF,\r
+ LNB_POWER_11V,\r
+ LNB_POWER_15V\r
+ };\r
+\r
+ static const uint32_t MAX_CHANNELS_ISDB_S = 23;\r
+ static const uint32_t MAX_CHANNELS_ISDB_T = 112;\r
+\r
+ class Listener\r
+ {\r
+ public:\r
+ virtual void put(uint8_t *buffer, uint32_t size) = 0;\r
+ };\r
+\r
+public:\r
+ Tuner() {};\r
+ virtual ~Tuner() {};\r
+ virtual void setListener(Listener *listener) = 0;\r
+\r
+ virtual const char *name() = 0;\r
+ virtual Type type() = 0;\r
+ virtual LnbPower lnbPower() = 0;\r
+ virtual bool getCnAgc(uint32_t *cn100, uint32_t *agc, uint32_t *maxAgc) = 0;\r
+\r
+ virtual int channel() = 0;\r
+ virtual bool setChannel(int channel) = 0;\r
+\r
+ virtual bool startRecording(int fd) = 0;\r
+ virtual int stopRecording() = 0;\r
+ virtual bool isRecording() = 0;\r
+\r
+ virtual bool lock() = 0;\r
+ virtual void unlock() = 0;\r
+ virtual bool isLocked() = 0;\r
+\r
+ // temporary\r
+ virtual bool startStreaming(struct sockaddr_in *) = 0;\r
+ virtual void stopStreaming() = 0;\r
+ virtual bool isStreaming() = 0;\r
+\r
+ /*\r
+ bool setRecordingFD(int recfd);\r
+ bool setDestination(const char *host, int port);\r
+ bool resetDestination(const char *host, int port);\r
+ */\r
+\r
+};\r
+ \r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_TUNER_H__\r
--- /dev/null
+//\r
+// TunerFactory.cpp\r
+//\r
+\r
+#include "ry0/device/TunerFactory.h"\r
+#include "ry0/device/PT1/PT1Tuner.h"\r
+#include "ry0/device/PT3/PT3Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+\r
+int TunerFactory::scan(Tuner *tuners[MAX_TUNERS], HMODULE multi2_dll)\r
+{\r
+ int count = 0;\r
+\r
+ // PT1/PT2\r
+ int scanned;\r
+ scanned = ry0::device::PT1::PT1Tuner::scan(&tuners[count], multi2_dll);\r
+ if (scanned > 0)\r
+ {\r
+ count += scanned;\r
+ }\r
+\r
+ // PT3\r
+ scanned = ry0::device::PT3::PT3Tuner::scan(&tuners[count], multi2_dll);\r
+ if (scanned > 0)\r
+ {\r
+ count += scanned;\r
+ }\r
+\r
+ return count;\r
+}\r
+\r
+} // device\r
+} // ry0\r
--- /dev/null
+//\r
+// TunerFactory.h\r
+//\r
+\r
+#ifndef __RY0_DEVICE_TUNERFACTORY_H__\r
+#define __RY0_DEVICE_TUNERFACTORY_H__\r
+\r
+#include <windows.h>\r
+#include <stdint.h>\r
+\r
+#include "ry0/device/Tuner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace device\r
+{\r
+\r
+class TunerFactory\r
+{\r
+public:\r
+\r
+ static int scan(Tuner *tuners[MAX_TUNERS], HMODULE multi2_dll);\r
+};\r
+\r
+} // device\r
+} // ry0\r
+\r
+#endif // __RY0_DEVICE_TUNERFACTORY_H__\r
--- /dev/null
+//
+//
+//
+
+#define DBG_LEVEL 3
+#include "Raym/Log.h"
+
+#include <process.h>
+
+#include "CommandRunner.h"
+
+using namespace Raym;
+
+namespace ry0
+{
+namespace iPTd
+{
+
+CommandRunner::CommandRunner()
+{
+ DebugLog2("CommandRunner::CommandRunner()");
+
+ _state = ST_IDLE;
+ _command = NULL;
+ _arguments = NULL;
+}
+
+CommandRunner::~CommandRunner()
+{
+ stop();
+
+ RELEASE(_command);
+ RELEASE(_arguments);
+
+ DebugLog2("CommandRunner::~CommandRunner()");
+}
+
+CommandRunner *CommandRunner::alloc()
+{
+ return new CommandRunner();
+}
+
+CommandRunner *CommandRunner::init()
+{
+ DebugLog2("CommandRunner::init()");
+
+ _state = ST_IDLE;
+
+ return this;
+}
+
+CommandRunner *CommandRunner::retain()
+{
+ DebugLog2("CommandRunner::retain()");
+
+ Object::retain();
+ return this;
+}
+
+CommandRunner *CommandRunner::autorelease()
+{
+ DebugLog2("CommandRunner::autorelease()");
+
+ Object::autorelease();
+ return this;
+}
+
+void CommandRunner::setCommandPath(String *path)
+{
+ DebugLog2("CommandRunner::setCommandPath()");
+
+ RELEASE(_command);
+ if (path != NULL)
+ {
+ _command = path->retain();
+ }
+}
+
+void CommandRunner::setArguments(Array *args)
+{
+ DebugLog2("CommandRunner::setArguments()");
+
+ RELEASE(_arguments);
+ if (args != NULL)
+ {
+ _arguments = args->retain();
+ }
+}
+
+bool CommandRunner::readLine(String *line)
+{
+ return false;
+}
+
+void CommandRunner::write(String *line)
+{
+}
+
+unsigned __stdcall CommandRunner_run(void *arg)
+{
+ ((CommandRunner *)arg)->run();
+ return 0;
+}
+
+void CommandRunner::run()
+{
+ DebugLog2("CommandRunner::run()");
+
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();
+
+ // lock
+ RaymLock(this);
+
+ while ((_command != NULL) && (_state == ST_READY))
+ {
+ DebugLog3("pre processing");
+
+ // パイプ生成
+ Pipe *pipe = Pipe::alloc()->init();
+
+ // タスク生成
+ Task *task = Task::alloc()->init();
+ task->setLaunchPath(_command);
+
+ // 引数設定
+ if (_arguments != NULL)
+ {
+ task->setArguments(_arguments);
+ }
+
+ // 標準出力設定
+ task->setStandardOutput(pipe->fileHandleForWriting());
+ task->setStandardError(pipe->fileHandleForWriting());
+
+ // タスク実行
+ task->launch();
+
+ // 読み込み
+ FileInputStream *fis = FileInputStream::fileInputStream(pipe->fileHandleForReading());
+
+ // 状態変更
+ _state = ST_RUN;
+
+ // unlock
+ RaymUnlock(this);
+
+ bool done = false;
+ while (!done)
+ {
+ // ループ処理
+ AutoreleasePool *pool2 = AutoreleasePool::alloc()->init();
+
+ // 1行読み込み
+ bool done2 = readLine(fis->readLine());
+
+ // lock
+ RaymLock(this);
+
+ // 終了チェック
+ done = (done2 || (_state == ST_DONE));
+
+ // unlock
+ RaymUnlock(this);
+
+ pool2->release();
+ }
+
+ DebugLog3("post processing");
+
+ // タスク終了
+ task->terminate();
+ task->release();
+
+ // パイプ破棄
+ pipe->release();
+
+ // lock
+ RaymLock(this);
+ break;
+ }
+
+ // 状態変更
+ _state = ST_IDLE;
+
+ // unlock
+ RaymUnlock(this);
+
+ pool->release();
+
+ DebugLog2("CommandRunner::run() done.");
+}
+
+bool CommandRunner::start()
+{
+ DebugLog2("CommandRunner::start()");
+
+ bool result = false;
+
+ RaymLock(this);
+
+ if (_state == ST_IDLE)
+ {
+ HANDLE h;
+ unsigned int uiThreadId;
+
+ h = (HANDLE)_beginthreadex(NULL, 0, CommandRunner_run, this, 0, &uiThreadId);
+ if (h != NULL)
+ {
+ _state = ST_READY;
+
+ RaymUnlock(this);
+
+ bool done = false;
+ while (!done)
+ {
+ bool needSleep = false;
+
+ RaymLock(this);
+
+ if (_state == ST_IDLE)
+ {
+ done = true;
+ }
+ else if (_state == ST_RUN)
+ {
+ done = true;
+ result = true;
+ }
+ else if (_state == ST_READY)
+ {
+ needSleep = true;
+ }
+ RaymUnlock(this);
+
+ if (needSleep)
+ {
+ ::Sleep(100); // 100 ms
+ }
+ }
+
+ RaymLock(this);
+ }
+ }
+
+ RaymUnlock(this);
+
+ return result;
+}
+
+void CommandRunner::stop()
+{
+ DebugLog2("CommandRunner::stop()");
+ RaymLock(this);
+ if (_state != ST_IDLE)
+ {
+ _state = ST_DONE;
+ }
+ RaymUnlock(this);
+ bool done = false;
+ while (!done)
+ {
+ RaymLock(this);
+ done = (_state == ST_IDLE);
+ RaymUnlock(this);
+ if (!done)
+ {
+ ::Sleep(100);
+ }
+ }
+ DebugLog2("CommandRunner::stop() done.");
+}
+
+bool CommandRunner::isRunning()
+{
+ bool result;
+ RaymLock(this);
+ result = (_state == ST_RUN);
+ RaymUnlock(this);
+ return result;
+}
+
+const char *CommandRunner::className()
+{
+ return "CommandRunner";
+}
+
+} // iPTd
+} // ry0
--- /dev/null
+//
+//
+//
+
+#pragma once
+
+#include "Raym/Raym.h"
+
+namespace ry0
+{
+namespace iPTd
+{
+
+class CommandRunner : public Raym::Object
+{
+private:
+ enum _state
+ {
+ ST_IDLE,
+ ST_READY,
+ ST_RUN,
+ ST_DONE
+ } _state;
+ Raym::String * _command;
+ Raym::Array * _arguments;
+
+protected:
+ CommandRunner();
+ ~CommandRunner();
+
+ virtual bool readLine(Raym::String *line);
+ void write(Raym::String *line);
+
+public:
+ static CommandRunner *alloc();
+ CommandRunner *init();
+ CommandRunner *retain();
+ CommandRunner *autorelease();
+
+ void setCommandPath(Raym::String *path);
+ void setArguments(Raym::Array *args);
+
+ void run();
+ bool start();
+ void stop();
+ bool isRunning();
+
+ virtual const char *className();
+};
+
+} // iPTd
+} // ry0
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+\r
+#include <time.h>\r
+#include <direct.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <io.h>\r
+#include <share.h>\r
+#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
+#include <Iphlpapi.h>\r
+\r
+#include "b25/aribstr.h"\r
+#include "b25/arib_std_b25.h"\r
+#include "b25/b_cas_card.h"\r
+\r
+#include "net/RTSPRequest.h"\r
+\r
+#include "ry0/iPTd/Controller.h"\r
+#include "ry0/iPTd/HTTPLiveStreaming.h"\r
+#include "ry0/iPTd/Extractor.h"\r
+\r
+\r
+using namespace Raym;\r
+using namespace NET;\r
+using namespace ry0::device;\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+static const char *PLIST_PREFIX = "com.gmail.tim.and.pom";\r
+\r
+// プロパティデフォルト値\r
+static const char * DEF_NAME = "iPTd_R3";\r
+static const char * DEF_HOSTNAME = "localhost";\r
+static const int DEF_HTTP_PORT = 50080; // HTTPポート\r
+static const int DEF_BEGIN_UDP_PORT = 51000; // UDPポートの開始位置\r
+static const char * DEF_COLLECT_EPG_TIME = "02:00:00"; // EPG収集する時刻 HH:MM::SS\r
+static const int DEF_SHUTDOWN_TIME_INIT = 15; // シャットダウンするまでの時間(分単位):起動後\r
+static const int DEF_SHUTDOWN_TIME = 5; // シャットダウンするまでの時間(分単位):録画後\r
+static const int DEF_FORCED_SHUTDOWN = 120; // 強制シャットダウンするまでの時間(分単位)\r
+static const int DEF_DISK_REMAIN = 10; //\r
+\r
+// 非同期実行コマンド\r
+static const long long CMD_RESTART = 0x0001; // 再開処理\r
+static const long long CMD_PERIODIC = 0x0003; // 周期処理\r
+static const long long CMD_PERIODIC_2 = 0x0004; // 周期処理2\r
+static const long long CMD_COLLECT_EPG_ISDB_S = 0x0005; // 番組情報取得(ISDB-S)\r
+static const long long CMD_COLLECT_EPG_ISDB_T = 0x0006; // 番組情報取得(ISDB-T)\r
+\r
+//\r
+static const TimeInterval DEF_COLLECT_EPG_DELAY = 1.0;\r
+static const TimeInterval DEF_COLLECT_EPG_RETRY = 60.0;\r
+\r
+static const time_t DEF_COLLECT_EPG_LIMIT_S = 10;\r
+static const time_t DEF_COLLECT_EPG_LIMIT_T = 20;\r
+\r
+static const time_t OFFSET_OF_START_TIME = -2; // 録画開始時刻の補正(秒単位)\r
+static const time_t OFFSET_OF_END_TIME = -3; // 録画停止時刻の補正(秒単位)\r
+static const time_t OFFSET_OF_WAKEUP = -600; // 起動スケジュールの補正(秒単位) 注:休止するまでの時間(DEF_SUSPEND_TIME)よりも短くすること\r
+static const time_t OFFSET_OF_SUPPRESSION_TIME = -720; // 録画開始前に休止の抑制を開始する時間(秒単位)\r
+\r
+\r
+std::string Controller::createVideoPath(int tuner)\r
+{\r
+ DebugLog2("Controller::createVideoPath()");\r
+\r
+ std::string result = "";\r
+\r
+ while (true)\r
+ {\r
+ time_t now;\r
+ time(&now);\r
+ TM tm;\r
+ if (localtime_s(&tm, &now) != 0)\r
+ {\r
+ break;\r
+ }\r
+\r
+ result = _store_path->cString();\r
+ DebugLog2("result: %s\n", result.c_str());\r
+\r
+ char tmp[128];\r
+ if (sprintf_s(tmp, sizeof(tmp), "\\%04d", tm.tm_year + 1900) < 0)\r
+ {\r
+ DebugLog0("sprintf_s() error: year\n");\r
+ result = "";\r
+ break;\r
+ }\r
+ result += tmp;\r
+ DebugLog2("result: %s\n", result.c_str());\r
+\r
+ STAT stat;\r
+ if (_stat(result.c_str(), &stat) != 0)\r
+ {\r
+ if (_mkdir(result.c_str()) != 0)\r
+ {\r
+ DebugLog0("_mkdir() error: year\n");\r
+ result = "";\r
+ break;\r
+ }\r
+ _stat(result.c_str(), &stat);\r
+ }\r
+ if ((stat.st_mode & _S_IFDIR) != _S_IFDIR)\r
+ {\r
+ DebugLog0("%s is not directory.\n", result.c_str());\r
+ result = "";\r
+ break;\r
+ }\r
+\r
+ if (sprintf_s(tmp, sizeof(tmp), "\\%02d", tm.tm_mon + 1) < 0)\r
+ {\r
+ DebugLog0("sprintf_s() error: month\n");\r
+ result = "";\r
+ break;\r
+ }\r
+ result += tmp;\r
+ DebugLog2("result: %s\n", result.c_str());\r
+\r
+ if (_stat(result.c_str(), &stat) != 0)\r
+ {\r
+ if (_mkdir(result.c_str()) != 0)\r
+ {\r
+ DebugLog0("_mkdir() error: month\n");\r
+ result = "";\r
+ break;\r
+ }\r
+ _stat(result.c_str(), &stat);\r
+ }\r
+ if ((stat.st_mode & _S_IFDIR) != _S_IFDIR)\r
+ {\r
+ DebugLog0("%s is not directory.", result.c_str());\r
+ result = "";\r
+ break;\r
+ }\r
+\r
+ if (sprintf_s(tmp, sizeof(tmp),\r
+ "\\%04d%02d%02d_%02d%02d%02d_%03d_%s.ts",\r
+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,\r
+ _tuners[tuner]->channel(), _tuners[tuner]->name()) < 0)\r
+ {\r
+ DebugLog0("sprintf_s() error: filename");\r
+ result = "";\r
+ break;\r
+ }\r
+ result += tmp;\r
+ DebugLog2("result: %s\n", result.c_str());\r
+\r
+ break;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+// epgの開始時刻でソートする為の比較関数\r
+Integer compareFunction(Object *obj1, Object *obj2, void *context)\r
+{\r
+ if (isKindOfClass(Dictionary, obj1) && isKindOfClass(Dictionary, obj2))\r
+ {\r
+ time_t st1;\r
+ time_t ed1;\r
+ Controller::getTimeWithEPG((Dictionary *)obj1, &st1, &ed1);\r
+\r
+ time_t st2;\r
+ time_t ed2;\r
+ Controller::getTimeWithEPG((Dictionary *)obj2, &st2, &ed2);\r
+\r
+ if (st1 < st2)\r
+ {\r
+ return OrderedAscending;\r
+ }\r
+ else if (st1 > st2)\r
+ {\r
+ return OrderedDescending;\r
+ }\r
+ else\r
+ {\r
+ if (ed1 < ed2)\r
+ {\r
+ return OrderedAscending;\r
+ }\r
+ else if (ed1 > ed2)\r
+ {\r
+ return OrderedDescending;\r
+ }\r
+ }\r
+ }\r
+ return OrderedSame;\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- EPG関連 -------\r
+#endif\r
+\r
+void Controller::removePastEPGs()\r
+{\r
+ DebugLog2("Controller::removePastEPGs()");\r
+\r
+ time_t now = time(NULL);\r
+\r
+ RaymLock(_epgs);\r
+\r
+ Dictionary *temp_data = _epgs->dictionaryForKey(KEY_TEMP_DATA);\r
+ if (temp_data != NULL)\r
+ {\r
+ temp_data->retain();\r
+ _epgs->removeObjectForKey(KEY_TEMP_DATA);\r
+ }\r
+ else\r
+ {\r
+ temp_data = Dictionary::alloc()->initWithCapacity(0);\r
+ }\r
+\r
+ Dictionary *services = _epgs->dictionaryForKey(KEY_SERVICES);\r
+ if (services != NULL)\r
+ {\r
+ Array *keys = services->allKeys();\r
+ for (uint i = 0; i < keys->count(); ++i)\r
+ {\r
+ String *key = (String *)keys->objectAtIndex(i);\r
+\r
+ std::string xmltv_programs;\r
+ Dictionary *temp_service = temp_data->dictionaryForKey(key);\r
+ if (temp_service == NULL)\r
+ {\r
+ temp_service = Dictionary::dictionaryWithCapacity(0);\r
+ temp_data->setObject(temp_service, key);\r
+ }\r
+\r
+ Array *old_epgs = services->arrayForKey(key);\r
+ Array *new_epgs = Array::arrayWithCapacity(0);\r
+ for (uint j = 0; j < old_epgs->count(); ++j)\r
+ {\r
+ Dictionary *epg = (Dictionary *)old_epgs->objectAtIndex(j);\r
+ time_t start = 0;\r
+ time_t end = 0;\r
+ getTimeWithEPG(epg, &start, &end);\r
+ if (now <= end)\r
+ {\r
+ new_epgs->addObject(epg);\r
+\r
+ Array *ch_list = temp_service->arrayForKey(KEY_CHANNELS);\r
+ if (ch_list != NULL)\r
+ {\r
+ std::string epg_date = epg->stringForKey(KEY_EPG_DATE)->stringByReplacingOccurrencesOfString("/", "")->cString();\r
+ std::string epg_start = epg->stringForKey(KEY_EPG_START)->stringByReplacingOccurrencesOfString(":", "")->cString();\r
+ std::string epg_end = epg->stringForKey(KEY_EPG_END)->stringByReplacingOccurrencesOfString(":", "")->cString();\r
+ std::string epg_event_id = epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ std::string epg_duration = epg->stringForKey(KEY_EPG_DURATION)->cString();\r
+ std::string epg_title = epg->stringForKey(KEY_EPG_TITLE)->cString();\r
+\r
+ for (uint ch_idx = 0; ch_idx < ch_list->count(); ++ch_idx)\r
+ {\r
+ xmltv_programs += " <programme start=\"" + epg_date + epg_start + " +0900\" stop=\"";\r
+ xmltv_programs += epg_date + epg_end + " +0900\" channel=\"";\r
+ xmltv_programs += ((String *)ch_list->objectAtIndex(ch_idx))->cString();\r
+ xmltv_programs += "\" event_id=\"" + epg_event_id + "\" duration=\"" + epg_duration + "\">\r\n";\r
+\r
+ xmltv_programs += " <title lang=\"ja_JP\">" + epg_title + "</title>\r\n";\r
+\r
+ xmltv_programs += " </programme>\r\n";\r
+ }\r
+ }\r
+ }\r
+ }\r
+ services->setObject(new_epgs, key);\r
+\r
+ if (xmltv_programs.length() > 0)\r
+ {\r
+ temp_service->setObject(String::stringWithUTF8String(xmltv_programs.c_str()), KEY_PROGRAMS);\r
+ }\r
+ }\r
+ }\r
+\r
+ _epgs->writeToFile(_epgs_path, true);\r
+\r
+ _epgs->setObject(temp_data, KEY_TEMP_DATA);\r
+ temp_data->release();\r
+\r
+ RaymUnlock(_epgs);\r
+}\r
+\r
+void Controller::collectEPGsForTuner(Tuner::Type type, int tuner, time_t limit)\r
+{\r
+ DebugLog2("Controller::collectEPGsForTuner(%d) start.", tuner);\r
+\r
+ // 既にロックされた状態でコールされる前提\r
+ bool locked = false;\r
+ RaymLock(this);\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ locked = _tuners[tuner]->isLocked();\r
+ }\r
+ RaymUnlock(this);\r
+ if (!locked)\r
+ {\r
+ DebugLog2("Controller::collectEPGsForTuner(%d) end(no locked).", tuner);\r
+ return;\r
+ }\r
+\r
+ for (uint cnt = 0; cnt * 5 < limit; ++cnt)\r
+ {\r
+ Extractor *extractor = Extractor::alloc()->init();\r
+\r
+ RaymLock(this);\r
+ _tuners[tuner]->setListener(extractor);\r
+ RaymUnlock(this);\r
+\r
+ Array *collected = extractor->collectEPGs(5);\r
+\r
+ RaymLock(this);\r
+ _tuners[tuner]->setListener(NULL);\r
+ RaymUnlock(this);\r
+\r
+ extractor->release();\r
+\r
+ RaymLock(_epgs);\r
+\r
+ for (uint j = 0; j < collected->count(); ++j)\r
+ {\r
+ Dictionary *epg = (Dictionary *)collected->objectAtIndex(j);\r
+\r
+ if (epg->stringForKey(KEY_EPG_TITLE) == NULL)\r
+ {\r
+ // タイトルが無い場合は不要\r
+ continue;\r
+ }\r
+\r
+ // Service ID を Primary Key\r
+ String *key = epg->stringForKey(KEY_EPG_SERVICE_ID);\r
+ if (key != NULL)\r
+ {\r
+ Dictionary *services = _epgs->dictionaryForKey(KEY_SERVICES);\r
+ if (services == NULL)\r
+ {\r
+ services = Dictionary::dictionaryWithCapacity(0);\r
+ _epgs->setObject(services, KEY_SERVICES);\r
+ }\r
+ Array *epgs = services->arrayForKey(key);\r
+ if (epgs == NULL)\r
+ {\r
+ epgs = Array::arrayWithCapacity(0);\r
+ services->setObject(epgs, key);\r
+ }\r
+ bool inserted = false;\r
+ for (uint idx = 0; idx < epgs->count(); ++idx)\r
+ {\r
+ Dictionary *epg2 = (Dictionary *)epgs->objectAtIndex(idx);\r
+ if (epg->stringForKey(KEY_EPG_EVENT_ID)->isEqualToString(epg2->stringForKey(KEY_EPG_EVENT_ID)))\r
+ {\r
+ inserted = true;\r
+ break;\r
+ }\r
+ if (compareFunction(epg, epgs->objectAtIndex(idx), NULL) == OrderedAscending)\r
+ {\r
+ epgs->insertObject(epg, idx);\r
+ inserted = true;\r
+ break;\r
+ }\r
+ }\r
+ if (!inserted)\r
+ {\r
+ epgs->addObject(epg);\r
+ }\r
+ }\r
+ }\r
+\r
+ RaymUnlock(_epgs);\r
+\r
+ RaymLock(this);\r
+ if (((type == Tuner::ISDB_S) && _cancel_epg_collect_s) ||\r
+ ((type == Tuner::ISDB_T) && _cancel_epg_collect_t))\r
+ {\r
+ cnt = (uint)limit;\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ removePastEPGs();\r
+\r
+ DebugLog2("Controller::collectEPGsForTuner(%d) end.", tuner);\r
+}\r
+\r
+bool Controller::collectEPGs(Tuner::Type type)\r
+{\r
+ // 使用するチューナを決定\r
+ int tuner = 0;\r
+ bool locked = false;\r
+ RaymLock(this);\r
+ for (int i = _tunerCount - 1; i >= 0; --i)\r
+ {\r
+ if (isTunerEnabled(i))\r
+ {\r
+ if ((!_tuners[i]->isLocked()) && (_tuners[i]->type() == type))\r
+ {\r
+ if (_tuners[i]->lock())\r
+ {\r
+ tuner = i;\r
+ locked = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+\r
+ // ロック確認\r
+ if (!locked)\r
+ {\r
+ DebugLog3("Controller::collectEPGs(%s) end(Can't locled).", type == Tuner::ISDB_S ? "ISDB-S" : "ISDB-T");\r
+ // ロックできない場合は収集しない\r
+ return false;\r
+ }\r
+\r
+ bool canceled = false;\r
+ DebugLog0("Collect EPG of \"%s(#%d)\" is started.", _tuners[tuner]->name(), tuner);\r
+\r
+ // 現在のチャンネルを保存\r
+ int channel = _tuners[tuner]->channel();\r
+\r
+ // チャンネルを変更しつつEPGを取得\r
+ int max_channel = (type == Tuner::ISDB_S ? Tuner::MAX_CHANNELS_ISDB_S : Tuner::MAX_CHANNELS_ISDB_T);\r
+ for (int ch = 0; ch <= max_channel; ++ch)\r
+ {\r
+ // チャンネルが有効かチェック\r
+ if (isChannelEnabled(tuner, ch))\r
+ {\r
+ // チャンネル設定\r
+ if (_tuners[tuner]->setChannel(ch))\r
+ {\r
+// DebugLog0("Collect EPG of \"%s(#%d)\" ch %d", _tuners[tuner]->name(), tuner, ch);\r
+ time_t limit = (time_t)_epgs->integerForKey(stationName(type, ch));\r
+ if (limit == 0)\r
+ {\r
+ limit = ((type == Tuner::ISDB_S) ? DEF_COLLECT_EPG_LIMIT_S : DEF_COLLECT_EPG_LIMIT_T);\r
+ _epgs->setInteger((int)limit, stationName(type, ch));\r
+ }\r
+\r
+ collectEPGsForTuner(type, tuner, limit);\r
+\r
+ RaymLock(this);\r
+ if (((type == Tuner::ISDB_S) && _cancel_epg_collect_s) ||\r
+ ((type == Tuner::ISDB_T) && _cancel_epg_collect_t))\r
+ {\r
+ ch = Tuner::MAX_CHANNELS_ISDB_T + 1;\r
+ canceled = true;\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+ }\r
+ }\r
+\r
+ // 元のチャンネルに戻す\r
+ _tuners[tuner]->setChannel(channel);\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // チューナをアンロック\r
+ _tuners[tuner]->unlock();\r
+\r
+ if (type == Tuner::ISDB_S)\r
+ {\r
+ _cancel_epg_collect_s = false;\r
+ }\r
+ else\r
+ {\r
+ _cancel_epg_collect_t = false;\r
+ }\r
+\r
+ // キーワード予約更新\r
+ updateKeywordsReservation();\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ DebugLog0("Collect EPG of \"%s(#%d)\" was %s.", _tuners[tuner]->name(), tuner, canceled ? "canceled" : "finished");\r
+\r
+ return !canceled;\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- 予約録画関連 -------\r
+#endif\r
+\r
+//\r
+// 録画予約:サービスID/イベントID指定\r
+// EPGデータから指定のサービスID/イベントIDのEPGを取り出し、EPG指定の録画予約をコール\r
+//\r
+bool Controller::reserve(int service_id, int event_id)\r
+{\r
+ DebugLog0("Controller::reserve(service_id, event_id)");\r
+ DebugLog0("event_id: %d, service_id: %d", event_id, service_id);\r
+\r
+ bool result = false;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ if ((_epgs != NULL) && (_epgs->dictionaryForKey(KEY_SERVICES) != NULL))\r
+ {\r
+ Array *events = _epgs->dictionaryForKey(KEY_SERVICES)->arrayForKey(String::stringWithFormat("%d", service_id));\r
+ if (events != NULL)\r
+ {\r
+ DebugLog0("count: %d, event_id: %d, service_id: %d", events->count(), event_id, service_id);\r
+ for (uint i = 0; i < events->count(); ++i)\r
+ {\r
+ Dictionary *epg = (Dictionary *)events->objectAtIndex(i);\r
+ DebugLog0("epg event_id: %s", epg->stringForKey(KEY_EPG_EVENT_ID)->cString());\r
+ if (epg->stringForKey(KEY_EPG_EVENT_ID)->isEqualToString(String::stringWithFormat("%d", event_id)))\r
+ {\r
+ result = reserve(epg);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("events is NULL");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("_epgs is NULL");\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+//\r
+// 録画予約:EPG指定\r
+// EPGからサービスIDを取り出し、チューナ情報を検索して一致するサービスIDがあったらチューナ/EPG指定の録画予約を試行\r
+//\r
+bool Controller::reserve(Dictionary *in_epg)\r
+{\r
+ DebugLog0("Controller::reserve(epg)");\r
+\r
+ bool result = false;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ while (in_epg != NULL)\r
+ {\r
+ // EPGを複製\r
+ Dictionary *epg = Dictionary::dictionaryWithDictionary(in_epg);\r
+ if (epg == NULL)\r
+ {\r
+ DebugLog3("Dictionary::dictionaryWithDictionary() ng.");\r
+ break;\r
+ }\r
+\r
+ // サービスID取得\r
+ String *service_id = epg->stringForKey(KEY_EPG_SERVICE_ID);\r
+ if (service_id == NULL)\r
+ {\r
+ DebugLog3("epg->stringForKey(KEY_EPG_SERVICE_ID) ng.");\r
+ break;\r
+ }\r
+ DebugLog3("service_id: %s\n", service_id->cString());\r
+\r
+ // 全チューナ情報取得\r
+ Dictionary *tunerInfos = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunerInfos == NULL)\r
+ {\r
+ DebugLog3("_props->dictionaryForKey(KEY_TUNERS) ng.");\r
+ break;\r
+ }\r
+\r
+ // チューナを検索\r
+ for (int i = 0; (!result) && (i < _tunerCount); ++i)\r
+ {\r
+ // チューナ情報取得\r
+ Dictionary *tunerInfo = tunerInfos->dictionaryForKey(_tuners[i]->name());\r
+ if (tunerInfo == NULL)\r
+ {\r
+ DebugLog3("tunerInfos->dictionaryForKey(_tuners[%d]->name()) ng.", i);\r
+ continue;\r
+ }\r
+\r
+ // 全チャンネル情報取得\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels == NULL)\r
+ {\r
+ DebugLog3("tunerInfo->dictionaryForKey(KEY_CHANNELS) ng.");\r
+ continue;\r
+ }\r
+\r
+ // キー取得\r
+ Array *chkeys = channels->allKeys();\r
+ for (uint ch = 0; ch < chkeys->count(); ++ch)\r
+ {\r
+ // チャンネル情報取得\r
+ Dictionary *channel = channels->dictionaryForKey((String *)chkeys->objectAtIndex(ch));\r
+ if (channel == NULL)\r
+ {\r
+ DebugLog3("channels->dictionaryForKey() ng.");\r
+ continue;\r
+ }\r
+\r
+ // 全サービス情報取得\r
+ Array *services = (Array *)channel->objectForKey(KEY_SERVICES);\r
+ if (services == NULL)\r
+ {\r
+ DebugLog3("channel->objectForKey() ng.");\r
+ continue;\r
+ }\r
+\r
+ for (uint s = 0; s < services->count(); ++s)\r
+ {\r
+ // サービス情報取得\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(s);\r
+ if (service == NULL)\r
+ {\r
+ DebugLog3("service->objectAtIndex() ng.");\r
+ continue;\r
+ }\r
+\r
+ // サービスIDを比較\r
+ String *sid = service->stringForKey(KEY_SERVICE_ID);\r
+ if ((sid != NULL) && sid->isEqualToString(service_id))\r
+ {\r
+ // チャンネルを設定\r
+ epg->setString((String *)chkeys->objectAtIndex(ch), KEY_EPG_CHANNEL);\r
+\r
+ // 録画予約\r
+ result = reserve(i, epg);\r
+\r
+ // チャンネルループのカウンタを更新(=ループを終了させる)\r
+ ch = chkeys->count();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+//\r
+// 録画予約:チューナ/EPG指定\r
+//\r
+bool Controller::reserve(int tuner, Dictionary *in_epg)\r
+{\r
+ DebugLog0("Controller::reserve(tuner, epg)");\r
+\r
+ bool result = false;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ while ((0 <= tuner) && (tuner < _tunerCount) && (in_epg != NULL))\r
+ {\r
+ Dictionary *epg = Dictionary::dictionaryWithDictionary(in_epg);\r
+ if (epg == NULL)\r
+ {\r
+ DebugLog3("Dictionary::dictionaryWithDictionary() ng.");\r
+ break;\r
+ }\r
+\r
+ Array *array = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if (array == NULL)\r
+ {\r
+ array = Array::arrayWithCapacity(0);\r
+ _reservations->setObject(array, _tuners[tuner]->name());\r
+ }\r
+\r
+ time_t epg_start;\r
+ time_t epg_end;\r
+ getTimeWithEPG(epg, &epg_start, &epg_end);\r
+ DebugLog2("epg start: %ld, end: %ld\n", epg_start, epg_end);\r
+\r
+ time_t pre_start = 0;\r
+ time_t pre_end = 0;\r
+ pre_end = time(NULL);\r
+ DebugLog2("pre_end: %ld", pre_end);\r
+\r
+ for (uint i = 0; i < array->count(); ++i)\r
+ {\r
+ Dictionary *cur = (Dictionary *)array->objectAtIndex(i);\r
+ time_t cur_start;\r
+ time_t cur_end;\r
+ getTimeWithEPG(cur, &cur_start, &cur_end);\r
+ DebugLog2("cur start: %ld, end: %ld\n", cur_start, cur_end);\r
+ if ((pre_end <= epg_start) && (epg_end <= cur_start))\r
+ {\r
+ DebugLog2("insert: %d\n", i);\r
+ array->insertObject(epg, i);\r
+ result = true;\r
+ break;\r
+ }\r
+ pre_start = cur_start;\r
+ pre_end = cur_end;\r
+ }\r
+\r
+ if (!result)\r
+ {\r
+ if (pre_end <= epg_start)\r
+ {\r
+ DebugLog2("add\n");\r
+ array->addObject(epg);\r
+ result = true;\r
+ }\r
+ else\r
+ {\r
+ DebugLog2("no add\n");\r
+ }\r
+ }\r
+ if (result)\r
+ {\r
+ epg->setInteger(_reservation_seq_id, KEY_EPG_RESV_ID);\r
+ _reservation_seq_id = (_reservation_seq_id + 1) % 1000000;\r
+ _reservations->setInteger(_reservation_seq_id, KEY_EPG_LAST_RESV_ID);\r
+\r
+ //\r
+ _reservations->writeToFile(_reservations_path, true);\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+//\r
+// tuner: 0 - (_tunerCount - 1) cancel current\r
+// tuner: -1 cancel reserve_id\r
+//\r
+bool Controller::cancel(int tuner, int reserve_id)\r
+{\r
+ bool result = false;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ //\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ Array *array = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if (array != NULL)\r
+ {\r
+ if (array->count() > 0)\r
+ {\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(0);\r
+ String *status = epg->stringForKey(KEY_EPG_STATUS);\r
+ if (status != NULL)\r
+ {\r
+ if (status->isEqualToString("running"))\r
+ {\r
+ epg->setString("stop", KEY_EPG_STATUS);\r
+ result = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ else if ((tuner < 0) && (0 <= reserve_id) && (reserve_id < 1000000))\r
+ {\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ Array *array = _reservations->arrayForKey(_tuners[i]->name());\r
+ if (array != NULL)\r
+ {\r
+ for (uint j = 0; j < array->count(); ++j)\r
+ {\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(j);\r
+ if (reserve_id == epg->integerForKey(KEY_EPG_RESV_ID))\r
+ {\r
+ String *status = epg->stringForKey(KEY_EPG_STATUS);\r
+ if ((status != NULL) && status->isEqualToString("running"))\r
+ {\r
+ epg->setString("stop", KEY_EPG_STATUS);\r
+ }\r
+ else\r
+ {\r
+ array->removeObjectAtIndex(j);\r
+ }\r
+ result = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if (result)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (result)\r
+ {\r
+ _reservations->writeToFile(_reservations_path, true);\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+//\r
+// 録画制御\r
+//\r
+void Controller::periodic(void)\r
+{\r
+ bool need_update = false;\r
+\r
+#ifdef OBJC_MEMORY_CHECK\r
+ DebugLog0("global_objc_count_ = %d", Raym::global_objc_count_);\r
+#endif\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // 現在時刻取得\r
+ time_t now = time(NULL);\r
+\r
+ DebugLog2("periodic: %d", now);\r
+\r
+ //\r
+ for (int tuner = 0; tuner < _tunerCount; ++tuner)\r
+ {\r
+ Array *array = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if ((array == NULL) || (array->count() == 0))\r
+ {\r
+ // next tuner\r
+ continue;\r
+ }\r
+\r
+ //\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(0);\r
+ time_t start;\r
+ time_t end;\r
+ getTimeWithEPG(epg, &start, &end);\r
+ \r
+ //\r
+ // 録画停止要否チェック\r
+ //\r
+ bool stop_need = false;\r
+ while (true)\r
+ {\r
+ String *status = epg->stringForKey(KEY_EPG_STATUS);\r
+ if (status != NULL)\r
+ {\r
+ if (status->isEqualToString("stop"))\r
+ {\r
+ stop_need = true;\r
+ break;\r
+ }\r
+ if (!status->isEqualToString("running"))\r
+ {\r
+ break;\r
+ }\r
+ else if (_store_remain <= DEF_DISK_REMAIN)\r
+ {\r
+ stop_need = true;\r
+ break;\r
+ }\r
+ }\r
+ if (end + OFFSET_OF_END_TIME <= now)\r
+ {\r
+ stop_need = true;\r
+ }\r
+ break;\r
+ }\r
+ if (stop_need)\r
+ {\r
+ DebugLog2("I try stop\n");\r
+ int fd =_tuners[tuner]->stopRecording();\r
+ if (fd < 0)\r
+ {\r
+ DebugLog1("stopRecording() error.\n");\r
+ }\r
+ else\r
+ {\r
+ DebugLog2("stopRecording() ok\n");\r
+ DebugLog0("stop recording of \"%s\"", _tuners[tuner]->name());\r
+ _close(fd);\r
+\r
+ if (_shutdown_time == 0)\r
+ {\r
+ _shutdown_time = DEF_SHUTDOWN_TIME;\r
+ }\r
+ }\r
+ array->removeObject(epg);\r
+ \r
+ if (array->count() > 0)\r
+ {\r
+ epg = (Dictionary *)array->objectAtIndex(0);\r
+ }\r
+ else\r
+ {\r
+ epg = NULL;\r
+ }\r
+ need_update = true;\r
+ }\r
+\r
+ if (epg == NULL)\r
+ {\r
+ // next tuner\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // 録画開始要否チェック\r
+ //\r
+ bool start_need = false;\r
+ start = end = 0;\r
+ getTimeWithEPG(epg, &start, &end);\r
+ if ((start != 0) && (end != 0))\r
+ {\r
+ String *status = epg->stringForKey(KEY_EPG_STATUS);\r
+ if ((status == NULL) || !(status->isEqualToString("running")))\r
+ {\r
+ if (end + OFFSET_OF_END_TIME <= now)\r
+ {\r
+ // 既に終了時間が経過しているので削除する\r
+ array->removeObject(epg);\r
+ }\r
+ else if (start + OFFSET_OF_START_TIME <= now)\r
+ {\r
+ start_need = true;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (start_need)\r
+ {\r
+ DebugLog2("I need start.\n");\r
+ String *ch = epg->stringForKey(KEY_EPG_CHANNEL);\r
+ if (ch != NULL)\r
+ {\r
+ int channel = atoi(ch->cString());\r
+ DebugLog2("channel: %d\n", channel);\r
+ std::string videopath = createVideoPath(tuner);\r
+ if (videopath != "")\r
+ {\r
+ DebugLog2("videopath: %s\n", videopath.c_str());\r
+ int fd = -1;\r
+ if (_sopen_s(&fd, videopath.c_str(),\r
+ (_O_CREAT | _O_EXCL | _O_WRONLY | _O_BINARY | _O_TRUNC), _SH_DENYRW, (_S_IREAD | _S_IWRITE)) == 0)\r
+ {\r
+ DebugLog2("open ok.\n");\r
+ bool startResult = true;\r
+ if (_tuners[tuner]->channel() != channel)\r
+ {\r
+ if (!setChannel(tuner, channel))\r
+ {\r
+ DebugLog3("setChannel() ng.");\r
+ startResult = false;\r
+ }\r
+ }\r
+\r
+ if (startResult)\r
+ {\r
+ if (_tuners[tuner]->startRecording(fd))\r
+ {\r
+ DebugLog2("startRecording() ok.");\r
+ DebugLog0("start recording of \"%s\" to %s.", _tuners[tuner]->name(), videopath.c_str());\r
+ }\r
+ else\r
+ {\r
+ DebugLog3("Tuner::startRecording() failed.");\r
+ startResult = false;\r
+ }\r
+ }\r
+\r
+ if (startResult)\r
+ {\r
+ epg->setString("running", KEY_EPG_STATUS);\r
+ }\r
+ else\r
+ {\r
+ _close(fd);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("open ng. 0x%08x\n", errno);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("Can't create videopath.\n");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error.\n");\r
+ }\r
+ }\r
+ }\r
+\r
+ if (need_update)\r
+ {\r
+ //\r
+ _reservations->writeToFile(_reservations_path, true);\r
+ }\r
+\r
+#if 0\r
+ // EPG収集時刻を取得\r
+ String *collect_str = _props->stringForKey(KEY_COLLECT_EPG_TIME);\r
+ if (collect_str != NULL)\r
+ {\r
+ // 秒に変換\r
+ time_t collect_time = 0;\r
+ getTimeWithString(collect_str, &collect_time);\r
+\r
+ // 現在時刻と比較\r
+ if ((collect_time <= now) && (now < collect_time + 1))\r
+ {\r
+ // タイマが起動中か確認\r
+ if ((_timer_epg_s == NULL) || !_timer_epg_s->valid())\r
+ {\r
+ // EPG収集用タイマ起動(ISDB-S)\r
+ RELEASE(_timer_epg_s);\r
+ _timer_epg_s = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_S, true);\r
+ if (_timer_epg_s != NULL)\r
+ {\r
+ _timer_epg_s->fire();\r
+ }\r
+ }\r
+\r
+ // タイマが起動中か確認\r
+ if ((_timer_epg_t == NULL) || !_timer_epg_t->valid())\r
+ {\r
+ // EPG収集用タイマ起動(ISDB-T)\r
+ RELEASE(_timer_epg_t);\r
+ _timer_epg_t = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_T, true);\r
+ if (_timer_epg_t != NULL)\r
+ {\r
+ _timer_epg_t->fire();\r
+ }\r
+ }\r
+ }\r
+ }\r
+#endif\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ //\r
+ // 1/100秒単位が 0 に近くなるように次回T.O.を微調整\r
+ // ただし、windowsは精度が低いので期待しないことw\r
+ //\r
+\r
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)\r
+ static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000Ui64;\r
+#else\r
+ static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000ULL;\r
+#endif\r
+ // 現在時刻を取得\r
+ FILETIME ft;\r
+ GetSystemTimeAsFileTime(&ft);\r
+\r
+ // EPOCH秒への変換\r
+ __time64_t now_sec;\r
+ __time64_t now_usec;\r
+ now_sec = ft.dwHighDateTime;\r
+ now_sec <<= 32;\r
+ now_sec |= ft.dwLowDateTime;\r
+ now_sec /= 10; /*convert into microseconds*/\r
+ now_sec -= DELTA_EPOCH_IN_MICROSECS;\r
+ now_usec = (now_sec % 1000000UL);\r
+ now_sec = now_sec / 1000000UL;\r
+\r
+ TimeInterval interval = (TimeInterval)now_usec;\r
+ interval = interval / 1000000;\r
+ _timer_periodic->setTimeInterval(1.005 - interval);\r
+\r
+#ifdef OBJC_MEMORY_CHECK\r
+ DebugLog0("global_objc_count_ = %d", Raym::global_objc_count_);\r
+#endif\r
+}\r
+\r
+void Controller::updateKeywordsReservation()\r
+{\r
+ DebugLog2("Controller::updateKeywordsReservation()");\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // 予約情報からキーワード予約フラグが設定されているものを削除\r
+ for (int tuner = 0; tuner < _tunerCount; ++tuner)\r
+ {\r
+ Array *epgs = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if (epgs != NULL)\r
+ {\r
+ for (uint epgs_idx_offset = epgs->count(); epgs_idx_offset > 0; --epgs_idx_offset)\r
+ {\r
+ Dictionary *epg = (Dictionary *)epgs->objectAtIndex(epgs_idx_offset - 1);\r
+ if (epg->boolForKey(KEY_EPG_RESERVED_BY_KEYWORDS))\r
+ {\r
+ epgs->removeObject(epg);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // キーワードで検索\r
+ Dictionary *keywords_info = _reservations->dictionaryForKey(KEY_EPG_KEYWORDS);\r
+\r
+ if ((keywords_info != NULL) && (_epgs != NULL) && (_epgs->dictionaryForKey(KEY_SERVICES) != NULL))\r
+ {\r
+ // キーワード、EPG有り\r
+\r
+ // _epgs からキー(サービスID)を取得\r
+ Array *service_id_keys = _epgs->dictionaryForKey(KEY_SERVICES)->allKeys();\r
+\r
+ // サービスIDでループ\r
+ for (uint service_id_keys_idx = 0; service_id_keys_idx < service_id_keys->count(); ++service_id_keys_idx)\r
+ {\r
+ // サービスID\r
+ String *service_id = (String *)service_id_keys->objectAtIndex(service_id_keys_idx);\r
+\r
+ // 局名\r
+ String *stationName = stationNameForServiceID(service_id);\r
+ if (stationName == NULL)\r
+ {\r
+ // 局名が取得できなかったら次のサービスIDへ\r
+ continue;\r
+ }\r
+\r
+ // 指定サービスIDのEPGを取得\r
+ Array *events = _epgs->dictionaryForKey(KEY_SERVICES)->arrayForKey(service_id);\r
+\r
+ //\r
+ for (uint events_idx = 0; events_idx < events->count(); ++events_idx)\r
+ {\r
+ // 指定イベントIDのEPGを取得\r
+ Dictionary *epg = (Dictionary *)events->objectAtIndex(events_idx);\r
+\r
+ // 取得したEPGがキーワードの条件にマッチするか\r
+// DebugLog0("sid: %s, eid: %s", service_id->cString(), epg->stringForKey(KEY_EPG_EVENT_ID)->cString());\r
+\r
+ time_t start;\r
+ getTimeWithString(epg->stringForKey(KEY_EPG_START), &start);\r
+\r
+ // キーワードの配列を取得\r
+ Array *keywords = keywords_info->allKeys();\r
+ for (uint keywords_idx = 0; keywords_idx < keywords->count(); ++keywords_idx)\r
+ {\r
+ // キーワード\r
+ String *kwd = (String *)keywords->objectAtIndex(keywords_idx);\r
+// DebugLog0("kwd: %s", kwd->cString());\r
+\r
+ // キーワード(分割)\r
+ Array *kwds = kwd->componentsSeparatedByString(",");\r
+ if (kwds == NULL)\r
+ {\r
+ continue;\r
+ }\r
+// DebugLog0("check 01");\r
+\r
+ // キーワード情報\r
+ Dictionary *kwdinf = keywords_info->dictionaryForKey(kwd);\r
+\r
+ // 局名フィルタ\r
+ String *kwdinf_service_id = kwdinf->stringForKey(KEY_EPG_SERVICE_ID);\r
+ if (kwdinf_service_id != NULL)\r
+ {\r
+ // 局名フィルタ有り\r
+ String *sname = stationNameForServiceID(kwdinf_service_id);\r
+ if (sname != NULL)\r
+ {\r
+ if (!stationName->isEqualToString(sname))\r
+ {\r
+ // 局名が異なる場合は次のキーワードへ\r
+ continue;\r
+ }\r
+ }\r
+ }\r
+// DebugLog0("check 02");\r
+\r
+ // 開始時刻フィルタ\r
+ String *kwdinf_start = kwdinf->stringForKey(KEY_EPG_START);\r
+ if (kwdinf_start != NULL)\r
+ {\r
+ // 開始時刻フィルタ有り\r
+ String *st = kwdinf_start->stringByAppendingString(":00");\r
+ time_t kwd_st, kwd_ed;\r
+ getTimeWithString(st, &kwd_st);\r
+ kwd_ed = kwd_st + 3600;\r
+\r
+ // 開始時刻フィルタの時刻 <= EPGの開始時刻 <= 開始時刻フィルタの時刻+60min ならOK\r
+ if ((kwd_st > start) || (start > kwd_ed))\r
+ {\r
+ // 範囲外なので次のキーワードへ\r
+ continue;\r
+ }\r
+ }\r
+// DebugLog0("check 03");\r
+\r
+ // タイトル\r
+ String *title = epg->stringForKey(KEY_EPG_TITLE);\r
+ bool title_flag = (title != NULL);\r
+\r
+ // 概要\r
+ String *desc = epg->stringForKey(KEY_EPG_DESCRIPTION);\r
+ bool desc_flag = (desc != NULL);\r
+\r
+ // キーワード(分割)がタイトル/概要のどちらかに、全て(AND)含まれていたら予約対象とする\r
+ for (uint kwds_idx = 0; kwds_idx < kwds->count(); ++kwds_idx)\r
+ {\r
+ String *kw = ((String *)kwds->objectAtIndex(kwds_idx))->stringByTrimming();\r
+\r
+ // タイトル\r
+ if (title != NULL)\r
+ {\r
+ Range r = title->rangeOfString(kw);\r
+ if (r.location == NotFound)\r
+ {\r
+ title_flag = false;\r
+ }\r
+ }\r
+\r
+ // 概要\r
+ if (desc != NULL)\r
+ {\r
+ Range r = desc->rangeOfString(kw);\r
+ if (r.location == NotFound)\r
+ {\r
+ desc_flag = false;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (title_flag || desc_flag)\r
+ {\r
+ // タイトル/概要のどちらかに、キーワード(分割)が全て含まれていたので\r
+ // この EPG を予約対象とする\r
+ Dictionary *epg2 = Dictionary::dictionaryWithDictionary(epg);\r
+ if (epg2 != NULL)\r
+ {\r
+// DebugLog0("matched kwd: %s", kwd->cString());\r
+ if (title != NULL)\r
+ {\r
+// DebugLog0("title: %s", title->cString());\r
+ }\r
+ if (desc != NULL)\r
+ {\r
+// DebugLog0("desc: %s", desc->cString());\r
+ }\r
+ epg2->setBool(true, KEY_EPG_RESERVED_BY_KEYWORDS);\r
+//DebugLog0("epg2: %s", epg2->toString().c_str());\r
+ reserve(epg2);\r
+ }\r
+ else\r
+ {\r
+//DebugLog0("epg copy failed");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+}\r
+\r
+void Controller::updateSchedule()\r
+{\r
+ DebugLog2("Controller::updateSchedule()");\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // レジューム時刻\r
+ time_t resume_time = 0;\r
+\r
+ // EPG収集時刻を取得\r
+ String *collect_epg_time = _props->stringForKey(KEY_COLLECT_EPG_TIME);\r
+ if (collect_epg_time != NULL)\r
+ {\r
+ getTimeWithString(collect_epg_time, &resume_time);\r
+ }\r
+\r
+ // 録画予約をチェック\r
+ for (int tuner = 0; tuner < _tunerCount; ++tuner)\r
+ {\r
+ Array *array = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if ((array == NULL) || (array->count() == 0))\r
+ {\r
+ // next tuner\r
+ continue;\r
+ }\r
+\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(0);\r
+ time_t start = 0;\r
+ time_t end = 0;\r
+ getTimeWithEPG(epg, &start, &end);\r
+ if ((start != 0) && (end != 0))\r
+ {\r
+ if (start < resume_time)\r
+ {\r
+ resume_time = start;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ TM resume_tm;\r
+ resume_time += OFFSET_OF_WAKEUP; // 起動時刻を調整\r
+ if (localtime_s(&resume_tm, &resume_time) == 0)\r
+ {\r
+ if (_props->stringForKey(KEY_POWER_MANAGER) != NULL)\r
+ {\r
+ char http_req[256];\r
+ sprintf_s(http_req, "http://%s/iptv.pl?wakeup=%04d/%02d/%02d_%02d:%02d:00",\r
+ _props->stringForKey(KEY_POWER_MANAGER)->cString(),\r
+ resume_tm.tm_year + 1900, resume_tm.tm_mon + 1,\r
+ resume_tm.tm_mday, resume_tm.tm_hour, resume_tm.tm_min);\r
+ URL *url = URL::URLWithString(http_req);\r
+ URLRequest *req = URLRequest::requestWithURL(url);\r
+ URLResponse *resp = NULL;\r
+ Error *error = NULL;\r
+ Data *data = URLConnection::sendSynchronousRequest(req, &resp, &error);\r
+ if (data != NULL)\r
+ {\r
+ String *html = String::stringWithUTF8String((const char *)data->bytes());\r
+ if ((html != NULL) && (html->rangeOfString("<body>OK</body>").location != NotFound))\r
+ {\r
+ DebugLog0("set wake schedule to \"%04d/%02d/%02d %02d:%02d:00\".",\r
+ resume_tm.tm_year + 1900, resume_tm.tm_mon + 1, resume_tm.tm_mday, resume_tm.tm_hour, resume_tm.tm_min);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ resetWakeSchedule();\r
+ if (setWakeSchedule(resume_tm.tm_year + 1900, resume_tm.tm_mon + 1, resume_tm.tm_mday, resume_tm.tm_hour, resume_tm.tm_min))\r
+ {\r
+ DebugLog0("set wake schedule to \"%04d/%02d/%02d %02d:%02d:00\".",\r
+ resume_tm.tm_year + 1900, resume_tm.tm_mon + 1, resume_tm.tm_mday, resume_tm.tm_hour, resume_tm.tm_min);\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- チューナ制御 -------\r
+#endif\r
+\r
+void Controller::scanChannel(int tuner)\r
+{\r
+ DebugLog2("Controller::scanChannel(%d)", tuner);\r
+\r
+ if ((tuner < 0) || (_tunerCount <= tuner))\r
+ {\r
+ DebugLog3("Invalid tuner: %d", tuner);\r
+ return;\r
+ }\r
+\r
+ DebugLog0("start channel scan of \"%s\".", _tuners[tuner]->name());\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // 設定ファイルから全チューナ情報取得\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo == NULL)\r
+ {\r
+ // 無ければ作成\r
+ tunersInfo = Dictionary::dictionaryWithCapacity(0);\r
+ _props->setObject(tunersInfo, KEY_TUNERS);\r
+ }\r
+\r
+ // 全チューナ情報から指定のチューナ情報を取得\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo == NULL)\r
+ {\r
+ // 無ければ作成\r
+ tunerInfo = Dictionary::dictionaryWithCapacity(0);\r
+ tunersInfo->setObject(tunerInfo, _tuners[tuner]->name());\r
+ }\r
+\r
+ // チューナを未初期化に設定\r
+ tunerInfo->setBool(false, KEY_INITIALIZED);\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ // 全チャンネル情報を作成\r
+ Dictionary *channels = Dictionary::dictionaryWithCapacity(0);\r
+ tunerInfo->setObject(channels, KEY_CHANNELS);\r
+\r
+ // チューナタイプにより最大チャンネル数を設定\r
+ int max_channel;\r
+ Tuner::Type type = _tuners[tuner]->type();\r
+ if (type == Tuner::ISDB_S)\r
+ {\r
+ max_channel = Tuner::MAX_CHANNELS_ISDB_S;\r
+ }\r
+ else\r
+ {\r
+ max_channel = Tuner::MAX_CHANNELS_ISDB_T;\r
+ }\r
+\r
+ // 最終設定成功チャンネル保持用変数\r
+ int lastChannel = -1;\r
+\r
+ // チャンネルサーチ\r
+ for (int ch = 0; ch <= max_channel; ++ch)\r
+ {\r
+ // チャンネル情報\r
+ Dictionary *channelInfo = Dictionary::dictionaryWithCapacity(0);\r
+\r
+ // チャンネルキー(10進数:PTに対するチャンネル番号)\r
+ char chkey[4];\r
+ sprintf_s(chkey, sizeof(chkey), "%03d", ch);\r
+ channels->setObject(channelInfo, chkey);\r
+\r
+ // チャンネルID(論理チャンネル番号)\r
+ char channelID[8];\r
+ if (type == Tuner::ISDB_S)\r
+ {\r
+ if (ch < 12)\r
+ {\r
+ sprintf_s(channelID, sizeof(channelID), "BS%02d", 1 + 2 * ch);\r
+ }\r
+ else if (ch < 24)\r
+ {\r
+ sprintf_s(channelID, sizeof(channelID), "ND%02d", 2 + 2 * (ch - 12));\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(channelID, sizeof(channelID), "ND%02d", 1 + 2 * (ch -24));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ static int TABLE[][3] =\r
+ {\r
+ { 2, 0, 3 },\r
+ { 12, 1, 22 },\r
+ { 21, 0, 12 },\r
+ { 62, 1, 63 },\r
+ { 112, 0, 62 }\r
+ };\r
+\r
+ uint i;\r
+ for (i = 0; i < sizeof(TABLE)/sizeof(*TABLE); ++i)\r
+ {\r
+ if (ch <= TABLE[i][0])\r
+ {\r
+ sprintf_s(channelID, sizeof(channelID), "%s%d", TABLE[i][1] ? "C" : "", ch + TABLE[i][2] - TABLE[i][0]);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // チャンネルIDを設定\r
+ channelInfo->setString(channelID, KEY_CHANNEL_ID);\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // チャンネル設定\r
+ if (_tuners[tuner]->setChannel(ch))\r
+ {\r
+ // 設定成功\r
+ DebugLog0(" CH %s: OK", chkey);\r
+\r
+ // チャンネルを有効に設定\r
+ channelInfo->setBool(true, KEY_ENABLED);\r
+\r
+ // 局情報を取得\r
+ Extractor *extractor = Extractor::alloc()->init();\r
+ _tuners[tuner]->setListener(extractor);\r
+\r
+ Dictionary *stationInfo = extractor->stationInfo();\r
+ if (stationInfo != NULL)\r
+ {\r
+ if (stationInfo->stringForKey(KEY_NAME) != NULL)\r
+ {\r
+ channelInfo->setString(stationInfo->stringForKey(KEY_NAME), KEY_NAME);\r
+ }\r
+ if (stationInfo->objectForKey(KEY_SERVICES) != NULL)\r
+ {\r
+ channelInfo->setObject(stationInfo->objectForKey(KEY_SERVICES), KEY_SERVICES);\r
+ }\r
+ if (channelInfo->stringForKey(KEY_NAME) != NULL)\r
+ {\r
+ DebugLog0(" Name: %s", channelInfo->stringForKey(KEY_NAME)->cString());\r
+ }\r
+ }\r
+\r
+ _tuners[tuner]->setListener(NULL);\r
+ extractor->release();\r
+\r
+ // 成功したチャンネルを保持\r
+ lastChannel = ch;\r
+ }\r
+ else\r
+ {\r
+ DebugLog0(" CH %s: NG", chkey);\r
+ }\r
+\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ RaymLock(this);\r
+\r
+ // チューナを初期化済みに更新\r
+ tunerInfo->setBool(true, KEY_INITIALIZED);\r
+\r
+ // 設定が成功したチャンネルが有るか\r
+ if (lastChannel >= 0)\r
+ {\r
+ // チューナを有効に設定\r
+ tunerInfo->setBool(true, KEY_ENABLED);\r
+\r
+ // 最終チャンネルをステータスファイルに設定\r
+ Dictionary *tunersInfo = _status->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo == NULL)\r
+ {\r
+ tunersInfo = Dictionary::dictionaryWithCapacity(0);\r
+ _status->setObject(tunersInfo, KEY_TUNERS);\r
+ }\r
+\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo == NULL)\r
+ {\r
+ tunerInfo = Dictionary::dictionaryWithCapacity(0);\r
+ tunersInfo->setObject(tunerInfo, _tuners[tuner]->name());\r
+ }\r
+\r
+ tunerInfo->setInteger(lastChannel, KEY_CHANNEL);\r
+\r
+ _status->writeToFile(_status_path, true);\r
+ }\r
+\r
+ // 設定ファイルを更新\r
+ _props->writeToFile(_props_path, true);\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+}\r
+\r
+int Controller::getChannel(int tuner)\r
+{\r
+ DebugLog2("Controller::getChannel()");\r
+\r
+ int channel = -1;\r
+\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _status->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ channel = tunerInfo->integerForKey(KEY_CHANNEL);\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return channel;\r
+}\r
+\r
+bool Controller::setChannel(int tuner, int channel)\r
+{\r
+ DebugLog2("Controller::setChannel()");\r
+\r
+ bool result = false;\r
+\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ if (!_tuners[tuner]->isLocked())\r
+ {\r
+ Dictionary *tunersInfo = _status->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo == NULL)\r
+ {\r
+ tunersInfo = Dictionary::dictionaryWithCapacity(0);\r
+ _status->setObject(tunersInfo, KEY_TUNERS);\r
+ }\r
+\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo == NULL)\r
+ {\r
+ tunerInfo = Dictionary::dictionaryWithCapacity(0);\r
+ tunersInfo->setObject(tunerInfo, _tuners[tuner]->name());\r
+ }\r
+\r
+ if (channel != _tuners[tuner]->channel())\r
+ {\r
+ if (_tuners[tuner]->setChannel(channel))\r
+ {\r
+ tunerInfo->setInteger(channel, KEY_CHANNEL);\r
+\r
+ _status->writeToFile(_status_path, true);\r
+\r
+ result = true;\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("set channel failed. %d, %d", tuner, channel);\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- システム関連 周期処理 -------\r
+#endif\r
+\r
+//\r
+// チューナ(streaming)制御/システム関連 周期処理\r
+//\r
+void Controller::periodic_2(void)\r
+{\r
+ time_t now = time(NULL);\r
+\r
+ //\r
+ // UDPポート監視\r
+ //\r
+\r
+ // マッピング(UDPPort:tuner,ch)情報取得\r
+ Dictionary *mapping = NULL;\r
+ if ((_streaming_ctrls != NULL) && ((mapping = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_UDP_TO_TUNER_SERVICE_ID)) != NULL))\r
+ {\r
+ // マッピング情報取得OK\r
+\r
+ // 使用中のUDPの情報を取得\r
+ // どれだけ使用中なのか不明なので、まずは必要サイズを調べる\r
+ DWORD size = 0;\r
+ if (GetExtendedUdpTable(NULL, &size, true, AF_INET, UDP_TABLE_OWNER_PID, 0) == ERROR_INSUFFICIENT_BUFFER)\r
+ {\r
+ // ERROR_INSUFFICIENT_BUFFER の場合、必要なバッファサイズが size に格納される\r
+\r
+ // バッファ確保\r
+ PMIB_UDPTABLE_OWNER_PID udptable = (PMIB_UDPTABLE_OWNER_PID)malloc(size);\r
+ if (udptable != NULL)\r
+ {\r
+ // バッファ確保OK\r
+\r
+ // UDP情報取得\r
+ if (GetExtendedUdpTable(udptable, &size, true, AF_INET, UDP_TABLE_OWNER_PID, 0) == NO_ERROR)\r
+ {\r
+ // 取得OK\r
+ DebugLog3("udptable->dwNumEntries: %d", udptable->dwNumEntries);\r
+\r
+ // 停止要否確認\r
+ Dictionary *using_port = _streaming_ctrls->dictionaryForKey(KEY_UDP_IN_USE);\r
+ if (using_port != NULL)\r
+ {\r
+ // key = 使用中ポート\r
+ Array *using_ports = using_port->allKeys();\r
+ if (using_ports != NULL)\r
+ {\r
+ // 使用中ポートでループ\r
+ for (uint i = 0; i < using_ports->count(); ++i)\r
+ {\r
+ // 停止要否フラグ\r
+ bool stop_need = true;\r
+\r
+ // 使用中のUDP情報でループ\r
+ for (uint j = 0; j < udptable->dwNumEntries; ++j)\r
+ {\r
+ if (((String *)using_ports->objectAtIndex(i))->intValue() == ntohs((WORD)udptable->table[j].dwLocalPort))\r
+ {\r
+ // 使用中なので停止不要\r
+ stop_need = false;\r
+ break;\r
+ }\r
+ }\r
+\r
+ // 停止要否\r
+ if (stop_need)\r
+ {\r
+ // マッピング情報を取得\r
+ String *tuner_and_service_id = mapping->stringForKey((String *)using_ports->objectAtIndex(i));\r
+ if (tuner_and_service_id != NULL)\r
+ {\r
+ // チューナとサービスIDに分割\r
+ Range r = tuner_and_service_id->rangeOfString("_");\r
+ if (r.location != NotFound)\r
+ {\r
+ int tuner = tuner_and_service_id->substringToIndex(r.location)->intValue();\r
+ int service_id = tuner_and_service_id->substringFromIndex(r.location + 1)->intValue();\r
+ DebugLog3("tuner: %d, service_id: %d", tuner, service_id);\r
+\r
+ DebugLog0("auto streaming stop: %s", ((String *)using_ports->objectAtIndex(i))->cString());\r
+\r
+ _tuners[tuner]->stopStreaming();\r
+ using_port->removeObjectForKey((String *)using_ports->objectAtIndex(i));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ // 起動要否確認\r
+ for (uint i = 0; i < udptable->dwNumEntries; ++i)\r
+ {\r
+ // ポート番号を文字列に変換して\r
+ char port[10];\r
+ sprintf_s(port, "%d", ntohs((WORD)udptable->table[i].dwLocalPort));\r
+ DebugLog3("port = %s", port);\r
+\r
+ // マッピング情報を取得\r
+ String *tuner_and_service_id = mapping->stringForKey(port);\r
+ if (tuner_and_service_id != NULL)\r
+ {\r
+ // 取得OK: 監視対象ポートが使用されている\r
+\r
+ // 使用アプリを調べる\r
+ bool auto_streaming = false;\r
+ char exec_path[MAX_PATH];\r
+ memset(exec_path, 0, sizeof(exec_path));\r
+\r
+ // プロセスハンドル取得\r
+ size_t returnValue;\r
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, udptable->table[i].dwOwningPid);\r
+ if (hProcess != NULL)\r
+ {\r
+ TCHAR exec[MAX_PATH];\r
+ memset(exec, 0, sizeof(exec));\r
+ DWORD len = sizeof(exec) - 1;\r
+\r
+ // イメージ取得\r
+ if (QueryFullProcessImageName(hProcess, 0, exec, &len))\r
+ {\r
+ // ワイド -> マルチ 変換\r
+ if (wcstombs_s(&returnValue, exec_path, sizeof(exec_path), exec, _TRUNCATE) == 0)\r
+ {\r
+ // 成功\r
+\r
+ // とりあえず、、、現状は "ffmpeg.exe" / "vlc.exe" / "Kodi.exe" があったら auto_streaming を true にする\r
+ if ((strstr(exec_path, "ffmpeg.exe") != NULL) ||\r
+ (strstr(exec_path, "vlc.exe") != NULL) ||\r
+ (strstr(exec_path, "Kodi.exe") != NULL))\r
+ {\r
+ auto_streaming = true;\r
+ }\r
+ }\r
+ }\r
+\r
+ // プロセスハンドル解放\r
+ CloseHandle(hProcess);\r
+ }\r
+\r
+ if (auto_streaming)\r
+ {\r
+ // チューナとサービスIDに分割\r
+ Range r = tuner_and_service_id->rangeOfString("_");\r
+ if (r.location != NotFound)\r
+ {\r
+ int tuner = tuner_and_service_id->substringToIndex(r.location)->intValue();\r
+ int service_id = tuner_and_service_id->substringFromIndex(r.location + 1)->intValue();\r
+ DebugLog3("tuner: %d, service_id: %d", tuner, service_id);\r
+\r
+ // 暫定\r
+ int channel = -1;\r
+ if (_streaming_ctrls->dictionaryForKey(KEY_MAPPING_TUNER_SERVICE_ID_TO_CHANNEL) != NULL)\r
+ {\r
+ channel = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_TUNER_SERVICE_ID_TO_CHANNEL)->integerForKey(tuner_and_service_id);\r
+ }\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // ロックされてない場合\r
+ if (!_tuners[tuner]->isLocked())\r
+ {\r
+ // ストリーミング開始可能\r
+\r
+ if (_tuners[tuner]->channel() != channel)\r
+ {\r
+ setChannel(tuner, channel);\r
+ }\r
+\r
+ SOCKADDR_IN dst_addr;\r
+ dst_addr.sin_family = AF_INET;\r
+ dst_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\r
+ dst_addr.sin_port = (WORD)udptable->table[i].dwLocalPort;\r
+\r
+ if (_tuners[tuner]->startStreaming(&dst_addr))\r
+ {\r
+ // 成功\r
+ DebugLog0("auto streaming start: %d", ntohs((WORD)udptable->table[i].dwLocalPort));\r
+\r
+ // 使用中ポートに登録\r
+ using_port = _streaming_ctrls->dictionaryForKey(KEY_UDP_IN_USE);\r
+ if (using_port == NULL)\r
+ {\r
+ using_port = Dictionary::dictionaryWithCapacity(0);\r
+ _streaming_ctrls->setObject(using_port, KEY_UDP_IN_USE);\r
+ }\r
+ using_port->setBool(true, port);\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // バッファ解放\r
+ free(udptable);\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // HLS\r
+ //\r
+ Dictionary *hls_info = _streaming_ctrls->dictionaryForKey(KEY_HLS_INFO);\r
+ if (hls_info != NULL)\r
+ {\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ RaymLock(this);\r
+ Dictionary *hls_info_tuner = hls_info->dictionaryForKey(_tuners[i]->name());\r
+ if (hls_info_tuner != NULL)\r
+ {\r
+ int counter = hls_info_tuner->integerForKey(KEY_COUNTER);\r
+ if (counter < 60)\r
+ {\r
+ hls_info_tuner->setInteger(counter + 1, KEY_COUNTER);\r
+ }\r
+ else\r
+ {\r
+ hls_info->removeObjectForKey(_tuners[i]->name());\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+ }\r
+\r
+ if ((now % 60) == 10)\r
+ {\r
+ if (isIdleState())\r
+ {\r
+ RaymLock(this);\r
+ if (((_timer_epg_s != NULL) && _timer_epg_s->valid()) ||\r
+ ((_timer_epg_t != NULL) && _timer_epg_t->valid()))\r
+ {\r
+ _idle_count = 0;\r
+ }\r
+ else\r
+ {\r
+ ++_idle_count;\r
+\r
+ DebugLog0("_idle_count: %d, _shutdown_time: %d", _idle_count, ((_shutdown_time == 0) ? DEF_SHUTDOWN_TIME_INIT : _shutdown_time));\r
+ if (_idle_count >= ((_shutdown_time == 0) ? DEF_SHUTDOWN_TIME_INIT : _shutdown_time))\r
+ {\r
+ RaymUnlock(this);\r
+\r
+ bool shutdown = (_props->stringForKey(KEY_POWER_MANAGER) != NULL);\r
+\r
+ //\r
+ if (shutdown)\r
+ {\r
+ Service::shutdown();\r
+ }\r
+ else\r
+ {\r
+ Service::sleep();\r
+ }\r
+\r
+ RaymLock(this);\r
+ _idle_count = 0;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+ }\r
+ else\r
+ {\r
+ RaymLock(this);\r
+ _idle_count = 0;\r
+ RaymUnlock(this);\r
+ }\r
+ }\r
+\r
+ if ((now % 60) == 20)\r
+ {\r
+ RaymLock(this);\r
+ _store_remain = FileManager::freeSpaceForPath(_store_path);\r
+ RaymUnlock(this);\r
+ }\r
+\r
+\r
+ //\r
+ // 1/100秒単位が 0 に近くなるように次回T.O.を微調整\r
+ //\r
+\r
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)\r
+ static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000Ui64;\r
+#else\r
+ static const __time64_t DELTA_EPOCH_IN_MICROSECS = 11644473600000000ULL;\r
+#endif\r
+ // 現在時刻を取得\r
+ FILETIME ft;\r
+ GetSystemTimeAsFileTime(&ft);\r
+\r
+ // EPOCH秒への変換\r
+ __time64_t now_sec;\r
+ __time64_t now_usec;\r
+ now_sec = ft.dwHighDateTime;\r
+ now_sec <<= 32;\r
+ now_sec |= ft.dwLowDateTime;\r
+ now_sec /= 10; /*convert into microseconds*/\r
+ now_sec -= DELTA_EPOCH_IN_MICROSECS;\r
+ now_usec = (now_sec % 1000000UL);\r
+ now_sec = now_sec / 1000000UL;\r
+\r
+ TimeInterval interval = (TimeInterval)now_usec;\r
+ interval = interval / 1000000;\r
+ _timer_periodic_2->setTimeInterval(1.005 - interval);\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- HTTP制御 -------\r
+#endif\r
+\r
+static std::string epg_regist_form(Dictionary *epg)\r
+{\r
+ DebugLog3("epg_regist_form() start.");\r
+\r
+ std::string epgs;\r
+\r
+ if ((epg != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_SERVICE_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_EVENT_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_START) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_END) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_DATE) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_TITLE) != NULL))\r
+ {\r
+ epgs += "<form id=\"";\r
+ epgs += "epg_";\r
+ epgs += epg->stringForKey(KEY_EPG_SERVICE_ID)->cString();\r
+ epgs += "_";\r
+ epgs += epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ epgs += "\" title=\"";\r
+ epgs += epg->stringForKey(KEY_EPG_START)->substringToIndex(5)->cString();\r
+ epgs += "-";\r
+ epgs += epg->stringForKey(KEY_EPG_END)->substringToIndex(5)->cString();\r
+ epgs += "\" class=\"panel\" action=\"regist.cgi\" method=\"GET\" target=\"_self\" onclick='return confirm(\"Is it ok?\");'>";\r
+\r
+ // 放送時間\r
+ epgs += "<h2>";\r
+ epgs += LocalizedString(KEY_I18N_Broadcasting_Time, NULL)->cString();\r
+ epgs += "</h2>";\r
+ epgs += "<fieldset>";\r
+ epgs += "<p class=\"normalText\"> ";\r
+ epgs += epg->stringForKey(KEY_EPG_DATE)->substringFromIndex(5)->cString();\r
+ epgs += " ";\r
+ epgs += epg->stringForKey(KEY_EPG_START)->substringToIndex(5)->cString();\r
+ epgs += "-";\r
+ epgs += epg->stringForKey(KEY_EPG_END)->substringToIndex(5)->cString();\r
+ epgs += "</p>";\r
+ epgs += "</fieldset>";\r
+\r
+ // 番組名\r
+ epgs += "<h2>";\r
+ epgs += LocalizedString(KEY_I18N_Program_Title, NULL)->cString();\r
+ epgs += "</h2>";\r
+ epgs += "<fieldset>";\r
+ epgs += "<p class=\"normalText\"> ";\r
+ epgs += epg->stringForKey(KEY_EPG_TITLE)->cString();\r
+ epgs += "</p>";\r
+ epgs += "</fieldset>";\r
+\r
+ // 概要\r
+ if (epg->stringForKey(KEY_EPG_DESCRIPTION) != NULL)\r
+ {\r
+ epgs += "<h2>";\r
+ epgs += LocalizedString(KEY_I18N_Description, NULL)->cString();\r
+ epgs += "</h2>";\r
+ epgs += "<fieldset>";\r
+ epgs += "<p class=\"normalText\"> ";\r
+ epgs += epg->stringForKey(KEY_EPG_DESCRIPTION)->cString();\r
+ epgs += "</p>";\r
+ epgs += "</fieldset>";\r
+ }\r
+\r
+ //\r
+ epgs += "<input type=\"hidden\" name=\"service_id\" value=\"";\r
+ epgs += epg->stringForKey(KEY_EPG_SERVICE_ID)->cString();\r
+ epgs += "\"/>";\r
+ epgs += "<input type=\"hidden\" name=\"event_id\" value=\"";\r
+ epgs += epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ epgs += "\"/>";\r
+ epgs += "<input class=\"redButton\" type=\"submit\" value=\"";\r
+ epgs += LocalizedString(KEY_I18N_New_Reservation, NULL)->cString();\r
+ epgs += "\"/>";\r
+ // epgs += "<a class=\"redButton\" type=\"submit\">";\r
+ // epgs += LocalizedString(KEY_I18N_New_Reservation, NULL)->cString();\r
+ // epgs += "</a>";\r
+ epgs += "</form>";\r
+ }\r
+\r
+ return epgs;\r
+}\r
+\r
+HTTPResponse *responseWithDictionary(HTTPRequest *request, Dictionary *dictionary)\r
+{\r
+ HTTPResponse *result = NULL;\r
+ if ((request != NULL) && (dictionary != NULL))\r
+ {\r
+ std::string xml = dictionary->toString();\r
+\r
+ // header\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->init();\r
+ // Date\r
+ // Server\r
+ // Content-Encoding\r
+ // Last-Modified\r
+ // Content-Type\r
+ header->setFieldBodyWithName("application/xml", "Content-Type");\r
+ // Connection\r
+ // Tranfer-Encoding\r
+ // Content-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", xml.length()), "Content-Length");\r
+\r
+ // body\r
+ InternetTextMessageBody *body = InternetTextMessageBody::alloc()->initWithString(String::stringWithUTF8String(xml.c_str()));\r
+\r
+ // message\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+ if (message != NULL)\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->autorelease();\r
+ result->setVersion(request->version());\r
+ result->setReason(NET::HTTPDaemon::reasonForStatus(200));\r
+ result->setStatus(200);\r
+ result->setMessage(message);\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+// positive response by XML\r
+HTTPResponse *responseForSuccess(HTTPRequest *request)\r
+{\r
+ Dictionary *dict = Dictionary::dictionaryWithCapacity(0);\r
+ dict->setString("Success", KEY_RESULT);\r
+ return responseWithDictionary(request, dict);\r
+}\r
+\r
+// negative response by XML\r
+HTTPResponse *responseForFailed(HTTPRequest *request)\r
+{\r
+ Dictionary *dict = Dictionary::dictionaryWithCapacity(0);\r
+ dict->setString("Failed", KEY_RESULT);\r
+ return responseWithDictionary(request, dict);\r
+}\r
+\r
+HTTPResponse *Controller::responseWithHTML(HTTPRequest *request, String *html)\r
+{\r
+ HTTPResponse *result = NULL;\r
+ if ((html != NULL) && (request != NULL))\r
+ {\r
+ // header\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->init();\r
+ // Date\r
+ // Server\r
+ // Content-Encoding\r
+ // Last-Modified\r
+ // Content-Type\r
+ header->setFieldBodyWithName("text/html", "Content-Type");\r
+ // Connection\r
+ // Tranfer-Encoding\r
+ // Content-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", html->length()), "Content-Length");\r
+\r
+ // body\r
+ InternetTextMessageBody *body = InternetTextMessageBody::alloc()->initWithString(html);\r
+\r
+ // message\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+ if (message != NULL)\r
+ {\r
+// result = HTTPResponse::response();\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setReason(NET::HTTPDaemon::reasonForStatus(200));\r
+ result->setStatus(200);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseWithUTF8Text(HTTPRequest *request, String *text)\r
+{\r
+ HTTPResponse *result = NULL;\r
+ if ((text != NULL) && (request != NULL))\r
+ {\r
+ // header\r
+ InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->init();\r
+ // Date\r
+ // Server\r
+ // Content-Encoding\r
+ // Last-Modified\r
+ // Content-Type\r
+ header->setFieldBodyWithName("text/plane; charset=UTF-8", "Content-Type");\r
+ // Connection\r
+ // Tranfer-Encoding\r
+ // Content-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", text->length()), "Content-Length");\r
+\r
+ // body\r
+ InternetTextMessageBody *body = InternetTextMessageBody::alloc()->initWithString(text);\r
+\r
+ // message\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+ if (message != NULL)\r
+ {\r
+// result = HTTPResponse::response();\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setReason(NET::HTTPDaemon::reasonForStatus(200));\r
+ result->setStatus(200);\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseByResult(HTTPRequest *request, bool result)\r
+{\r
+ HTTPResponse *retval = NULL;\r
+\r
+ bool iui = false;\r
+\r
+ String *ref = NULL;\r
+ InternetTextMessage *msg = request->message();\r
+ if (msg != NULL)\r
+ {\r
+ InternetTextMessageHeader *header = msg->header();\r
+ if (header != NULL)\r
+ {\r
+ String *field_referer = header->fieldBodyForName("Referer");\r
+ if (field_referer != NULL)\r
+ {\r
+ String *field_host = header->fieldBodyForName("Host");\r
+ if (field_host != NULL)\r
+ {\r
+ std::string tmp = "^http://";\r
+ tmp += field_host->cString();\r
+ tmp += "/(programs_(t|s)_\\d+|reservation)\\.html$";\r
+ iui = field_referer->isMatch(tmp.c_str());\r
+ DebugLog0("tmp: %s", tmp.c_str());\r
+ DebugLog0("ref: %s", field_referer->cString());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (iui)\r
+ {\r
+ String *path = _httpd->rootPath()->stringByAppendingPathComponent("template2.html");\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html != NULL)\r
+ {\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", "Result");\r
+ std::string contents;\r
+ std::string reservations;\r
+ contents += "<div id=\"home\" class=\"panel\" title=\"Result\" selected=\"true\">";\r
+ if (result)\r
+ {\r
+ contents += "<h2>Success</h2>";\r
+ }\r
+ else\r
+ {\r
+ contents += "<h2>Failed</h2>";\r
+ }\r
+ contents += "</div>";\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ retval = responseWithHTML(request, html);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (result)\r
+ {\r
+ retval = responseForSuccess(request);\r
+ }\r
+ else\r
+ {\r
+ retval = responseForFailed(request);\r
+ }\r
+ }\r
+\r
+ return retval;\r
+}\r
+\r
+HTTPResponse *Controller::responseForMain(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForMain()");\r
+\r
+ HTTPResponse *result = NULL;\r
+ while ((request != NULL) && (client != NULL))\r
+ {\r
+ String *path = _httpd->rootPath();\r
+ if (path == NULL)\r
+ {\r
+ DebugLog3("_httpd->rootPath() ng.");\r
+ break;\r
+ }\r
+\r
+ path = path->stringByAppendingPathComponent("template1.html");\r
+ if (path == NULL)\r
+ {\r
+ DebugLog3("path->stringByAppendingPathComponent() ng.");\r
+ break;\r
+ }\r
+\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html == NULL)\r
+ {\r
+ DebugLog3("String::stringWithContentsOfFile() ng.");\r
+ break;\r
+ }\r
+\r
+ String *server_name = _props->stringForKey(KEY_NAME);\r
+ if (server_name == NULL)\r
+ {\r
+ DebugLog3("_props->stringForKey(KEY_NAME) ng.");\r
+ break;\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", server_name);\r
+ if (html == NULL)\r
+ {\r
+ DebugLog3("html->stringByReplacingOccurrencesOfString() ng.");\r
+ break;\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%PAGE_TITLE%%", LocalizedString(KEY_I18N_Main_Menu, NULL));\r
+ if (html == NULL)\r
+ {\r
+ DebugLog3("html->stringByReplacingOccurrencesOfString() ng.");\r
+ }\r
+\r
+ std::string contents;\r
+ contents += "<div id=\"home\" class=\"panel\" selected=\"true\">";\r
+ contents += "<ul>";\r
+ contents += "<li><a target=\"_self\" href=\"/programs.html\">";\r
+ contents += LocalizedString(KEY_I18N_Programs, NULL)->cString();\r
+ contents += "</a></li>";\r
+ contents += "<li><a target=\"_self\" href=\"/tv.html\">";\r
+ contents += LocalizedString(KEY_I18N_TV, NULL)->cString();\r
+ contents += "</a></li>";\r
+ contents += "<li><a target=\"_self\" href=\"/video.html\">";\r
+ contents += LocalizedString(KEY_I18N_Video, NULL)->cString();\r
+ contents += "</a></li>";\r
+ contents += "<li><a target=\"_self\" href=\"/reservation.html\">";\r
+ contents += LocalizedString(KEY_I18N_Reservation, NULL)->cString();\r
+ contents += "</a></li>";\r
+ contents += "</ul>";\r
+#if 0\r
+ contents += "<ul>";\r
+ contents += "<li><a target=\"_self\" href=\"/exec_vlc.html\">VLC media player";\r
+ contents += "</ul>";\r
+#endif\r
+ contents += "<ul>";\r
+ contents += "<li><a target=\"_self\" href=\"/status.html\">";\r
+ contents += LocalizedString(KEY_I18N_Tuner_Status, NULL)->cString();\r
+ contents += "</a></li>";\r
+ contents += "</ul>";\r
+ contents += "<center><a target=\"_self\" href=\"/iptd.log\">Ver. ";\r
+ contents += VERSION;\r
+ contents += "</a></center>";\r
+ contents += "</div>";\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ if (html != NULL)\r
+ {\r
+ result = responseWithHTML(request, html);\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForPrograms(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForPrograms() start.");\r
+\r
+ HTTPResponse *result = NULL;\r
+ while ((request != NULL) && (client != NULL))\r
+ {\r
+ String *path = _httpd->rootPath();\r
+ if (path == NULL)\r
+ {\r
+ DebugLog3("_httpd->rootPath() ng.");\r
+ break;\r
+ }\r
+\r
+ path = path->stringByAppendingPathComponent("template2.html");\r
+ if (path == NULL)\r
+ {\r
+ DebugLog0("path->stringByAppendingPathComponent() ng.");\r
+ break;\r
+ }\r
+\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html == NULL)\r
+ {\r
+ DebugLog0("String::stringWithContentsOfFile() ng.");\r
+ break;\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", LocalizedString(KEY_I18N_Programs, NULL));\r
+ if (html == NULL)\r
+ {\r
+ DebugLog0("html->stringByReplacingOccurrencesOfString() ng.");\r
+ break;\r
+ }\r
+\r
+ std::string contents;\r
+\r
+ String *uri = request->URI();\r
+ if (uri->isMatch("^/programs\\.html$"))\r
+ {\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Programs, NULL)->cString();\r
+ contents += "\" selected=\"true\">";\r
+\r
+ // 地デジ\r
+ contents += "<li>";\r
+ contents += "<a target=\"_self\" href=\"/programs_t.html\">";\r
+ contents += LocalizedString(KEY_I18N_Digital_Terrestrial_Television_Broadcasting, NULL)->cString();\r
+ contents += "</a></li>";\r
+ // BS/CS\r
+ contents += "<li>";\r
+ contents += "<a target=\"_self\" href=\"/programs_s.html\">";\r
+ contents += "BS/CS";\r
+ contents += "</a></li>";\r
+\r
+ contents += "</ul>";\r
+ }\r
+ else if (uri->isMatch("^/programs_t\\.html$"))\r
+ {\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Digital_Terrestrial_Television_Broadcasting, NULL)->cString();\r
+ contents += "\" selected=\"true\">";\r
+\r
+ // 地デジ(局名)\r
+ Array *stations = stationInfos(Tuner::ISDB_T);\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a target=\"_self\" href=\"/programs_t_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += ".html\">";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "</a></li>";\r
+ }\r
+ }\r
+\r
+ contents += "</ul>";\r
+ }\r
+ else if (uri->isMatch("^/programs_s\\.html$"))\r
+ {\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += "BS/CS";\r
+ contents += "\" selected=\"true\">";\r
+\r
+ Array *stations = stationInfos(Tuner::ISDB_S);\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a target=\"_self\" href=\"/programs_s_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += ".html\">";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "</a></li>";\r
+ }\r
+ }\r
+\r
+ contents += "</ul>";\r
+ }\r
+ else if (uri->isMatch("^/programs_(t|s)_.+\\.html$"))\r
+ {\r
+ Array *stations = NULL;\r
+ String *ch_id = NULL;\r
+ if (uri->isMatch("programs_t_"))\r
+ {\r
+ stations = stationInfos(Tuner::ISDB_T);\r
+ ch_id = uri->stringByReplacingOccurrencesOfString("/programs_t_", "");\r
+ ch_id = ch_id->stringByReplacingOccurrencesOfString(".html", "");\r
+ }\r
+ else\r
+ {\r
+ stations = stationInfos(Tuner::ISDB_S);\r
+ ch_id = uri->stringByReplacingOccurrencesOfString("/programs_s_", "");\r
+ ch_id = ch_id->stringByReplacingOccurrencesOfString(".html", "");\r
+ }\r
+\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ station->stringForKey(KEY_CHANNEL_ID)->isEqualToString(ch_id))\r
+ {\r
+ std::string epgs;\r
+\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "\" selected=\"true\">";\r
+\r
+ Array *programs = programsForServices(station->arrayForKey(KEY_SERVICES));\r
+ for (uint i = 0; i < programs->count(); ++i)\r
+ {\r
+ Dictionary *epg = (Dictionary *)programs->objectAtIndex(i);\r
+ if ((epg != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_SERVICE_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_EVENT_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_DATE) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_START) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_END) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#epg_";\r
+ contents += epg->stringForKey(KEY_EPG_SERVICE_ID)->cString();\r
+ contents += "_";\r
+ contents += epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ contents += "\">";\r
+ contents += epg->stringForKey(KEY_EPG_DATE)->substringFromIndex(5)->cString();\r
+ contents += " ";\r
+ contents += epg->stringForKey(KEY_EPG_START)->substringToIndex(5)->cString();\r
+ contents += "-";\r
+ contents += epg->stringForKey(KEY_EPG_END)->substringToIndex(5)->cString();\r
+ contents += "</a></li>";\r
+\r
+ epgs += epg_regist_form(epg);\r
+ }\r
+ }\r
+\r
+ contents += "</ul>";\r
+\r
+ contents += epgs;\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ if (html != NULL)\r
+ {\r
+ result = responseWithHTML(request, html);\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+#if 0\r
+ HTTPResponse *result = NULL;\r
+ while ((request != NULL) && (client != NULL))\r
+ {\r
+ String *path = _httpd->rootPath();\r
+ if (path == NULL)\r
+ {\r
+ DebugLog0("_httpd->rootPath() ng.");\r
+ break;\r
+ }\r
+\r
+ path = path->stringByAppendingPathComponent("template2.html");\r
+ if (path == NULL)\r
+ {\r
+ DebugLog0("path->stringByAppendingPathComponent() ng.");\r
+ break;\r
+ }\r
+\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html == NULL)\r
+ {\r
+ DebugLog0("String::stringWithContentsOfFile() ng.");\r
+ break;\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", LocalizedString(KEY_I18N_Programs, NULL));\r
+ if (html == NULL)\r
+ {\r
+ DebugLog0("html->stringByReplacingOccurrencesOfString() ng.");\r
+ break;\r
+ }\r
+\r
+ std::string contents;\r
+ std::string epgs;\r
+\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Programs, NULL)->cString();\r
+ contents += "\" selected=\"true\">";\r
+ // 地デジ\r
+ contents += "<li>";\r
+ contents += "<a href=\"#isdb_t\">";\r
+ contents += LocalizedString(KEY_I18N_Digital_Terrestrial_Television_Broadcasting, NULL)->cString();\r
+ contents += "</a></li>";\r
+ // BS/CS\r
+ contents += "<li>";\r
+ contents += "<a href=\"#isdb_s\">";\r
+ contents += "BS/CS";\r
+ contents += "</a></li>";\r
+\r
+ contents += "</ul>";\r
+\r
+ // 地デジ(局名)\r
+ contents += "<ul id=\"isdb_t\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Digital_Terrestrial_Television_Broadcasting, NULL)->cString();\r
+ contents += "\">";\r
+ Array *stations = stationInfos(Tuner::ISDB_T);\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#isdb_t_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += "\">";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "</a></li>";\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+\r
+ // 地デジ(番組データ)\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+\r
+ contents += "<ul id=\"isdb_t_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += "\" title=\"";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "\">";\r
+\r
+ Array *programs = programsForServices(station->arrayForKey(KEY_SERVICES));\r
+ for (uint i = 0; i < programs->count(); ++i)\r
+ {\r
+ Dictionary *epg = (Dictionary *)programs->objectAtIndex(i);\r
+ if ((epg != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_SERVICE_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_EVENT_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_DATE) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_START) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_END) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#epg_";\r
+ contents += epg->stringForKey(KEY_EPG_SERVICE_ID)->cString();\r
+ contents += "_";\r
+ contents += epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ contents += "\">";\r
+ contents += epg->stringForKey(KEY_EPG_DATE)->substringFromIndex(5)->cString();\r
+ contents += " ";\r
+ contents += epg->stringForKey(KEY_EPG_START)->substringToIndex(5)->cString();\r
+ contents += "-";\r
+ contents += epg->stringForKey(KEY_EPG_END)->substringToIndex(5)->cString();\r
+ contents += "</a></li>";\r
+\r
+ epgs += epg_regist_form(epg);\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+ }\r
+ }\r
+\r
+ // BS/CS(局名)\r
+ contents += "<ul id=\"isdb_s\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Digital_Terrestrial_Television_Broadcasting, NULL)->cString();\r
+ contents += "\">";\r
+ stations = stationInfos(Tuner::ISDB_S);\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#isdb_s_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += "\">";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "</a></li>";\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+\r
+ // BS/CS(番組データ)\r
+ for (uint i = 0; i < stations->count(); ++i)\r
+ {\r
+ Dictionary *station = (Dictionary *)stations->objectAtIndex(i);\r
+ if ((station != NULL) &&\r
+ (station->stringForKey(KEY_CHANNEL_ID) != NULL) &&\r
+ (station->stringForKey(KEY_NAME) != NULL))\r
+ {\r
+ contents += "<ul id=\"isdb_s_";\r
+ contents += station->stringForKey(KEY_CHANNEL_ID)->cString();\r
+ contents += "\" title=\"";\r
+ contents += station->stringForKey(KEY_NAME)->cString();\r
+ contents += "\">";\r
+\r
+ Array *programs = programsForServices(station->arrayForKey(KEY_SERVICES));\r
+ for (uint i = 0; i < programs->count(); ++i)\r
+ {\r
+ Dictionary *epg = (Dictionary *)programs->objectAtIndex(i);\r
+ if ((epg != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_SERVICE_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_EVENT_ID) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_DATE) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_START) != NULL) &&\r
+ (epg->stringForKey(KEY_EPG_END) != NULL))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#epg_";\r
+ contents += epg->stringForKey(KEY_EPG_SERVICE_ID)->cString();\r
+ contents += "_";\r
+ contents += epg->stringForKey(KEY_EPG_EVENT_ID)->cString();\r
+ contents += "\">";\r
+ contents += epg->stringForKey(KEY_EPG_DATE)->substringFromIndex(5)->cString();\r
+ contents += " ";\r
+ contents += epg->stringForKey(KEY_EPG_START)->substringToIndex(5)->cString();\r
+ contents += "-";\r
+ contents += epg->stringForKey(KEY_EPG_END)->substringToIndex(5)->cString();\r
+ contents += "</a></li>";\r
+\r
+ epgs += epg_regist_form(epg);\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+ }\r
+ }\r
+\r
+ contents += epgs;\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ if (html != NULL)\r
+ {\r
+ result = responseWithHTML(request, html);\r
+ }\r
+\r
+ break;\r
+ } \r
+ return result;\r
+}\r
+#endif\r
+\r
+HTTPResponse *Controller::responseForReservation(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForReservation() start.");\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ HTTPResponse *result = NULL;\r
+ while ((request != NULL) && (client != NULL))\r
+ {\r
+ // create array of reservations sorted by seq_id.\r
+ Array *array = Array::arrayWithCapacity(0);\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ Array *tmp = _reservations->arrayForKey(_tuners[i]->name());\r
+ if (tmp == NULL)\r
+ {\r
+ continue;\r
+ }\r
+ for (uint idx = 0; idx < tmp->count(); ++idx)\r
+ {\r
+ Dictionary *epg = (Dictionary *)tmp->objectAtIndex(idx);\r
+ if (epg == NULL)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ time_t epg_start;\r
+ time_t tmp_end;\r
+ getTimeWithEPG(epg, &epg_start, &tmp_end);\r
+\r
+ bool inserted = false;\r
+ for (uint j = 0; j < array->count(); ++j)\r
+ {\r
+ Dictionary *epg2 = (Dictionary *)array->objectAtIndex(j);\r
+ if (epg2 == NULL)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ time_t epg2_start;\r
+ getTimeWithEPG(epg2, &epg2_start, &tmp_end);\r
+\r
+ if (epg_start <= epg2_start)\r
+ {\r
+ array->insertObject(epg, j);\r
+ inserted = true;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!inserted)\r
+ {\r
+ array->addObject(epg);\r
+ }\r
+ }\r
+ }\r
+\r
+ String *path = _httpd->rootPath();\r
+ if (path == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ path = path->stringByAppendingPathComponent("template2.html");\r
+ if (path == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", LocalizedString(KEY_I18N_Reservation, NULL));\r
+ if (html == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ std::string contents;\r
+ std::string reservations;\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Reservation, NULL)->cString();\r
+ contents += "\" selected=\"true\">";\r
+\r
+#if 0\r
+ contents += "<li><a href=\"#tuners\">";\r
+ contents += "<font color=\"blue\">[";\r
+ contents += LocalizedString(KEY_I18N_Tuner, NULL)->cString();\r
+ contents += "]</font>";\r
+ contents += "</a></li>";\r
+#endif\r
+\r
+ //\r
+ // "[新規予約]"\r
+ //\r
+ contents += "<li><a href=\"#new_reservation\">";\r
+ contents += "<font color=\"red\">[";\r
+ contents += LocalizedString(KEY_I18N_New_Reservation, NULL)->cString();\r
+ contents += "]</font>";\r
+ contents += "</a></li>";\r
+\r
+ //\r
+ // "[キーワード]"\r
+ //\r
+ contents += "<li><a href=\"#keywords\">";\r
+ contents += "<font color=\"blue\">[";\r
+ contents += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ contents += "]</font>";\r
+ contents += "</a></li>";\r
+\r
+ //\r
+ // 登録済み予約情報\r
+ //\r
+ for (uint i = 0; i < array->count(); ++i)\r
+ {\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(i);\r
+ char seq_id[7];\r
+ sprintf_s(seq_id, "%06d", epg->integerForKey(KEY_EPG_RESV_ID) % 1000000);\r
+ contents += "<li>";\r
+ contents += "<a href=\"#seqid";\r
+ contents += seq_id;\r
+ contents += "\">";\r
+ String *title = epg->stringForKey(KEY_EPG_TITLE);\r
+ if (title != NULL)\r
+ {\r
+ contents += title->cString();\r
+ }\r
+ else\r
+ {\r
+ time_t start;\r
+ time_t end;\r
+ Controller::getTimeWithEPG(epg, &start, &end);\r
+ TM tm;\r
+ if (localtime_s(&tm, &start) == 0)\r
+ {\r
+ char date_time[24];\r
+ sprintf_s(date_time, "%04d/%02d/%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);\r
+ contents += date_time;\r
+ }\r
+ else\r
+ {\r
+ contents += seq_id;\r
+ }\r
+ }\r
+ contents += "</a></li>";\r
+\r
+ // reservations\r
+ reservations += "<div id=\"";\r
+ reservations += "seqid";\r
+ reservations += seq_id;\r
+ reservations += "\" title=\"";\r
+ reservations += "xxxxxx";\r
+ reservations += "\" class=\"panel\">";\r
+\r
+ //reservations += "<h2>Status</h2>";\r
+ reservations += "<fieldset>";\r
+\r
+ //\r
+ reservations += "<div class=\"row\">";\r
+ reservations += "<label>Date</label>";\r
+ reservations += "<span>";\r
+ String *tmp = epg->stringForKey(KEY_EPG_DATE);\r
+ reservations += tmp->cString();\r
+ reservations += "</span>";\r
+ reservations += "</div>";\r
+\r
+ reservations += "<div class=\"row\">";\r
+ reservations += "<label>Start</label>";\r
+ reservations += "<span>";\r
+ tmp = epg->stringForKey(KEY_EPG_START);\r
+ reservations += tmp->cString();\r
+ reservations += "</span>";\r
+ reservations += "</div>";\r
+\r
+ reservations += "<div class=\"row\">";\r
+ reservations += "<label>End</label>";\r
+ reservations += "<span>";\r
+ tmp = epg->stringForKey(KEY_EPG_END);\r
+ reservations += tmp->cString();\r
+ reservations += "</span>";\r
+ reservations += "</div>";\r
+\r
+ reservations += "</fieldset>";\r
+\r
+ reservations += "<a class=\"whiteButton\" type=\"submit\" href=\"/cancel.cgi?";\r
+ reservations += "resv_id=";\r
+ reservations += seq_id;\r
+ reservations += "\" onclick='return confirm(\"To cancel. Is it ok?\");'>";\r
+ reservations += LocalizedString(KEY_I18N_Cancel, NULL)->cString();\r
+ reservations += "</a>";\r
+\r
+ reservations += "</div>";\r
+ }\r
+\r
+ contents += "</ul>";\r
+ contents += reservations;\r
+\r
+ //\r
+ // 新規予約:ここから\r
+ //\r
+\r
+ // 予約時間の初期値作成\r
+ TM tm1, tm2;\r
+ time_t time1 = time(NULL);\r
+ time1 = (time1 + 15 * 60) / (15 * 60);\r
+ time1 = time1 * 15 * 60;\r
+ time_t time2 = time1 + 15 * 60;\r
+ localtime_s(&tm1, &time1);\r
+ localtime_s(&tm2, &time2);\r
+ \r
+ contents += "<form name=\"reservation\" id=\"new_reservation\" class=\"panel\" method=\"GET\" action=\"regist.cgi\" target=\"_self\">";\r
+ contents += "<fieldset>";\r
+ contents += "<div class=\"row\">";\r
+ contents += "<label>";\r
+ contents += LocalizedString(KEY_I18N_Station_Name, NULL)->cString();\r
+ contents += " : </label>";\r
+ contents += "<span>";\r
+ contents += "<select name=\"service_id\" size=\"1\">";\r
+\r
+ // 局情報の収集\r
+ Array *stationInfos = Controller::stationInfos(Tuner::ISDB_T);\r
+ if (stationInfos != NULL)\r
+ {\r
+ stationInfos->addObjectsFromArray(Controller::stationInfos(Tuner::ISDB_S));\r
+ }\r
+ else\r
+ {\r
+ stationInfos = Controller::stationInfos(Tuner::ISDB_S);\r
+ }\r
+ for (uint i = 0; (stationInfos != NULL) && (i < stationInfos->count()); ++i)\r
+ {\r
+ Array *services = ((Dictionary *)stationInfos->objectAtIndex(i))->arrayForKey(KEY_SERVICES);\r
+\r
+// とりえあず、現状は最初のサービスのみ表示\r
+// for (uint j = 0; (services != NULL) && (j < services->count()); ++j)\r
+ for (uint j = 0; (services != NULL) && (j < 1); ++j)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(j);\r
+\r
+ // テレビ放送かチェック\r
+ if ((service->stringForKey(KEY_SERVICE_TYPE) != NULL) && service->stringForKey(KEY_SERVICE_TYPE)->isEqualToString("1"))\r
+ {\r
+ String *name = service->stringForKey(KEY_NAME);\r
+ String *sid = service->stringForKey(KEY_SERVICE_ID);\r
+ if ((name != NULL) && (sid != NULL))\r
+ {\r
+ String *tmp = String::stringWithFormat("<option value=\"%s\">%s[%s]</option>", sid->cString(), name->cString(), sid->cString());\r
+ contents += tmp->cString();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ contents += "</select>";\r
+ contents += "</span>";\r
+ contents += "</div>";\r
+ contents += "<div class=\"row\">";\r
+ contents += "<label>";\r
+ contents += LocalizedString(KEY_I18N_Date, NULL)->cString();\r
+ contents += " : </label>";\r
+ contents += "<span>";\r
+ contents += "<select name=\"year\" size=\"1\">";\r
+ for (int year = tm1.tm_year + 1900; year < tm1.tm_year + 1900 + 3; ++year)\r
+ {\r
+ char year_buf[64];\r
+ sprintf_s(year_buf, "<option value=\"%d\">%d</option>", year, year);\r
+ contents += year_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "<select name=\"month\" size=\"1\">";\r
+ for (int month = 1; month < 13; ++month)\r
+ {\r
+ char month_buf[64];\r
+ if (month == tm1.tm_mon + 1)\r
+ {\r
+ sprintf_s(month_buf, "<option value=\"%d\" selected>%d</option>", month, month);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(month_buf, "<option value=\"%d\">%d</option>", month, month);\r
+ }\r
+ contents += month_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "<select name=\"day\" size=\"1\">";\r
+ for (int day = 1; day < 32; ++day)\r
+ {\r
+ char day_buf[64];\r
+ if (day == tm1.tm_mday)\r
+ {\r
+ sprintf_s(day_buf, "<option value=\"%d\" selected>%d</option>", day, day);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(day_buf, "<option value=\"%d\">%d</option>", day, day);\r
+ }\r
+ contents += day_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "</span>";\r
+ contents += "</div>";\r
+ contents += "<div class=\"row\">";\r
+ contents += "<label>";\r
+ contents += LocalizedString(KEY_I18N_Start_Time, NULL)->cString();\r
+ contents += " : </label>";\r
+ contents += "<span>";\r
+ contents += "<select name=\"start_hour\" size=\"1\">";\r
+ for (int sh = 0; sh < 24; ++sh)\r
+ {\r
+ char sh_buf[64];\r
+ if (sh == tm1.tm_hour)\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\" selected>%02d</option>", sh, sh);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\">%02d</option>", sh, sh);\r
+ }\r
+ contents += sh_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "<select name=\"start_min\" size=\"1\">";\r
+ for (int sm = 0; sm < 60; ++sm)\r
+ {\r
+ char sm_buf[64];\r
+ if (sm == tm1.tm_min)\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\" selected>%02d</option>", sm, sm);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\">%02d</option>", sm, sm);\r
+ }\r
+ contents += sm_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "</span>";\r
+ contents += "</div>";\r
+ contents += "<div class=\"row\">";\r
+ contents += "<label>";\r
+ contents += LocalizedString(KEY_I18N_End_Time, NULL)->cString();\r
+ contents += " : </label>";\r
+ contents += "<span>";\r
+ contents += "<select name=\"end_hour\" size=\"1\">";\r
+ for (int eh = 0; eh < 24; ++eh)\r
+ {\r
+ char eh_buf[64];\r
+ if (eh == tm2.tm_hour)\r
+ {\r
+ sprintf_s(eh_buf, "<option value=\"%02d\" selected>%02d</option>", eh, eh);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(eh_buf, "<option value=\"%02d\">%02d</option>", eh, eh);\r
+ }\r
+ contents += eh_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "<select name=\"end_min\" size=\"1\">";\r
+ for (int em = 0; em < 60; ++em)\r
+ {\r
+ char em_buf[64];\r
+ if (em == tm2.tm_min)\r
+ {\r
+ sprintf_s(em_buf, "<option value=\"%02d\" selected>%02d</option>", em, em);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(em_buf, "<option value=\"%02d\">%02d</option>", em, em);\r
+ }\r
+ contents += em_buf;\r
+ }\r
+ contents += "</select>";\r
+ contents += "</span>";\r
+ contents += "</div>";\r
+ contents += "<div class=\"row\">";\r
+ contents += "<label>";\r
+ contents += LocalizedString(KEY_I18N_Repeat, NULL)->cString();\r
+ contents += " : </label>";\r
+ contents += "<span>";\r
+ contents += "<select name=\"repeat\" size=\"1\">";\r
+ contents += "<option value=\"off\" selected>";\r
+ contents += LocalizedString(KEY_I18N_Repeat_off, NULL)->cString();\r
+ contents += "</option>";\r
+ contents += "<option value=\"everyday\">";\r
+ contents += LocalizedString(KEY_I18N_Repeat_everyday, NULL)->cString();\r
+ contents += "</option>";\r
+ contents += "<option value=\"weekly\">";\r
+ contents += LocalizedString(KEY_I18N_Repeat_weekly, NULL)->cString();\r
+ contents += "</option>";\r
+ contents += "<option value=\"weekday\">";\r
+ contents += LocalizedString(KEY_I18N_Repeat_weekday, NULL)->cString();\r
+ contents += "</option>";\r
+ contents += "</select>";\r
+ contents += "</span>";\r
+ contents += "</div>";\r
+ contents += "</fieldset>";\r
+\r
+ contents += "<input type=\"submit\" class=\"whiteButton\" value=\"";\r
+ contents += LocalizedString(KEY_I18N_Registration, NULL)->cString();\r
+ contents += "\">";\r
+ contents += "</form>";\r
+\r
+ //\r
+ // 新規予約:ここまで\r
+ //\r
+\r
+\r
+ //\r
+ // チューナ:ここから\r
+ //\r
+ contents += "<ul id=\"tuners\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Tuner, NULL)->cString();\r
+ contents += "\">";\r
+\r
+ std::string controls;\r
+ Dictionary *tunerInfos = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunerInfos != NULL)\r
+ {\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ Dictionary *tunerInfo = tunerInfos->dictionaryForKey(_tuners[i]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ if (tunerInfo->boolForKey(KEY_INITIALIZED) && tunerInfo->boolForKey(KEY_ENABLED))\r
+ {\r
+ char key[4];\r
+ sprintf_s(key, "%03d", i);\r
+\r
+ // tuner list\r
+ contents += "<li>";\r
+ contents += "<a href=\"#tuner";\r
+ contents += key;\r
+ contents += "\">";\r
+ contents += key;\r
+ contents += ": ";\r
+ Dictionary *dict = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (dict != NULL)\r
+ {\r
+ char chkey[4];\r
+ sprintf_s(chkey, "%03d", tunerInfo->integerForKey(KEY_CHANNEL));\r
+ dict = dict->dictionaryForKey(chkey);\r
+ String *name = dict->stringForKey(KEY_NAME);\r
+ if (name != NULL)\r
+ {\r
+ contents += name->cString();\r
+ }\r
+ else\r
+ {\r
+ dict = NULL;\r
+ }\r
+ }\r
+ if (dict == NULL)\r
+ {\r
+ contents += _tuners[i]->name();\r
+ }\r
+ contents += "</a></li>";\r
+\r
+ // controls\r
+ controls += "<form name=\"control\" id=\"tuner";\r
+ controls += key;\r
+ controls += "\" class=\"panel\" method=\"GET\" action=\"/";\r
+ controls += key;\r
+ controls += "/recording=on\" target=\"_self\">";\r
+\r
+ // 白い枠:ここから\r
+ controls += "<fieldset>";\r
+\r
+ // 局指定:ここから\r
+ controls += "<div class=\"row\">";\r
+ controls += "<label>";\r
+ controls += LocalizedString(KEY_I18N_Station_Name, NULL)->cString();\r
+ controls += " : </label>";\r
+ controls += "<span>";\r
+ controls += "<select name=\"channel\" size=\"1\">";\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels != NULL)\r
+ {\r
+ for (int ch = 0; ch <= Tuner::MAX_CHANNELS_ISDB_T; ++ch)\r
+ {\r
+ char chkey[4];\r
+ sprintf_s(chkey, "%03d", ch);\r
+ dict = channels->dictionaryForKey(chkey);\r
+ if (dict == NULL)\r
+ {\r
+ break;\r
+ }\r
+ Array *services = (Array *)dict->objectForKey(KEY_SERVICES);\r
+ if (services != NULL)\r
+ {\r
+ for (uint s = 0; s < services->count(); ++s)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(s);\r
+ if (service != NULL)\r
+ {\r
+ char sid[8];\r
+ sprintf_s(sid, "%d", service->integerForKey(KEY_SERVICE_ID));\r
+ controls += "<option value=\"";\r
+ controls += chkey;\r
+ controls += "\"";\r
+ // selected\r
+ controls += ">";\r
+ String *name = service->stringForKey(KEY_NAME);\r
+ if (name != NULL)\r
+ {\r
+ controls += name->cString();\r
+ }\r
+ controls += "[";\r
+ controls += sid;\r
+ controls += "]</option>";\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ controls += "</select>";\r
+ controls += "</span>";\r
+ controls += "</div>";\r
+ // 局指定:ここまで\r
+\r
+ // 時間指定:ここから\r
+ controls += "<div class=\"row\">";\r
+ controls += "<label>";\r
+ controls += LocalizedString(KEY_I18N_Time, NULL)->cString();\r
+ controls += " : </label>";\r
+ controls += "<span>";\r
+ controls += "<select name=\"hour\" size=\"1\">";\r
+ for (int sh = 0; sh < 24; ++sh)\r
+ {\r
+ char sh_buf[64];\r
+ if (sh == 1)\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\" selected>%02d</option>", sh, sh);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\">%02d</option>", sh, sh);\r
+ }\r
+ controls += sh_buf;\r
+ }\r
+ controls += "</select>";\r
+ controls += "<select name=\"min\" size=\"1\">";\r
+ for (int sm = 0; sm < 60; ++sm)\r
+ {\r
+ char sm_buf[64];\r
+ if (sm == 0)\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\" selected>%02d</option>", sm, sm);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\">%02d</option>", sm, sm);\r
+ }\r
+ controls += sm_buf;\r
+ }\r
+ controls += "</select>";\r
+ controls += "</span>";\r
+ controls += "</div>";\r
+ // 時間指定:ここまで\r
+\r
+ controls += "</fieldset>";\r
+ // 白い枠:ここまで\r
+\r
+ controls += "<input type=\"submit\" class=\"whiteButton\" value=\"";\r
+ controls += LocalizedString(KEY_I18N_Registration, NULL)->cString();\r
+ controls += "\">";\r
+ controls += "</form>";\r
+ }\r
+ }\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+ contents += controls;\r
+\r
+ //\r
+ // チューナ:ここまで\r
+ //\r
+\r
+ //\r
+ // キーワード:ここから\r
+ //\r
+ contents += "<ul id=\"keywords\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ contents += "\">";\r
+\r
+ contents += "<li><a href=\"#dialogForm\">";\r
+ contents += "<font color=\"red\">[";\r
+// contents += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ contents += LocalizedString(KEY_I18N_Add, NULL)->cString();\r
+ contents += "]</font>";\r
+ contents += "</a></li>";\r
+\r
+ // 登録済みキーワード\r
+ Dictionary *keywords_info = _reservations->dictionaryForKey(KEY_EPG_KEYWORDS);\r
+ if (keywords_info != NULL)\r
+ {\r
+ controls = "";\r
+ Array *keys = keywords_info->allKeys();\r
+ if (keys != NULL)\r
+ {\r
+ for (uint i = 0; i < keys->count(); ++i)\r
+ {\r
+ Dictionary *kwd_inf = keywords_info->dictionaryForKey((String *)keys->objectAtIndex(i));\r
+ if (kwd_inf == NULL)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ char tmp[32];\r
+ sprintf_s(tmp, "%d", i);\r
+ contents += "<li><a href=\"#keywords_";\r
+ contents += tmp;\r
+ contents += "\">";\r
+ contents += ((String *)keys->objectAtIndex(i))->cString();\r
+ contents += "</a></li>";\r
+\r
+ controls += "<form name=\"filter\" id=\"keywords_";\r
+ controls += tmp;\r
+ controls += "\" class=\"panel\" method=\"GET\" action=\"mod_keywords.cgi\" target=\"_self\">";\r
+ controls += "<input type=\"hidden\" name=\"keywords\" value=\"";\r
+ controls += ((String *)keys->objectAtIndex(i))->cString();\r
+ controls += "\">";\r
+ controls += "<fieldset>";\r
+\r
+ controls += "<div class=\"row\">";\r
+ controls += "<label>";\r
+ controls += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ controls += " : </label>";\r
+ controls += "<span>";\r
+ controls += ((String *)keys->objectAtIndex(i))->cString();\r
+ controls += "</span>";\r
+ controls += "</div>";\r
+\r
+ controls += "<div class=\"row\">";\r
+ controls += "<label>";\r
+ controls += LocalizedString(KEY_I18N_Station_Name, NULL)->cString();\r
+ controls += " : </label>";\r
+ controls += "<span>";\r
+ controls += "<select name=\"service_id\" size=\"1\">";\r
+ controls += "<option value=\"-\">----</option>";\r
+\r
+ String *service_id = kwd_inf->stringForKey(KEY_EPG_SERVICE_ID);\r
+\r
+ // 局情報の収集\r
+ Array *stationInfos = Controller::stationInfos(Tuner::ISDB_T);\r
+ if (stationInfos != NULL)\r
+ {\r
+ stationInfos->addObjectsFromArray(Controller::stationInfos(Tuner::ISDB_S));\r
+ }\r
+ else\r
+ {\r
+ stationInfos = Controller::stationInfos(Tuner::ISDB_S);\r
+ }\r
+ for (uint i = 0; (stationInfos != NULL) && (i < stationInfos->count()); ++i)\r
+ {\r
+ Array *services = ((Dictionary *)stationInfos->objectAtIndex(i))->arrayForKey(KEY_SERVICES);\r
+\r
+ for (uint j = 0; (services != NULL) && (j < 1); ++j)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(j);\r
+\r
+ // テレビ放送かチェック\r
+ if ((service->stringForKey(KEY_SERVICE_TYPE) != NULL) && service->stringForKey(KEY_SERVICE_TYPE)->isEqualToString("1"))\r
+ {\r
+ String *name = service->stringForKey(KEY_NAME);\r
+ String *sid = service->stringForKey(KEY_SERVICE_ID);\r
+ if ((name != NULL) && (sid != NULL))\r
+ {\r
+ if ((service_id != NULL) && (service_id->isEqualToString(sid)))\r
+ {\r
+ String *tmp = String::stringWithFormat("<option value=\"%s\" selected>%s[%s]</option>", sid->cString(), name->cString(), sid->cString());\r
+ controls += tmp->cString();\r
+ }\r
+ else\r
+ {\r
+ String *tmp = String::stringWithFormat("<option value=\"%s\">%s[%s]</option>", sid->cString(), name->cString(), sid->cString());\r
+ controls += tmp->cString();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ controls += "</select>";\r
+ controls += "</span>";\r
+ controls += "</div>";\r
+\r
+ controls += "<div class=\"row\">";\r
+ controls += "<label>";\r
+ controls += LocalizedString(KEY_I18N_Start_Time, NULL)->cString();\r
+ controls += " : </label>";\r
+ controls += "<span>";\r
+ controls += "<select name=\"start_hour\" size=\"1\">";\r
+ controls += "<option value=\"-\">--</option>";\r
+ String *sh_str = kwd_inf->stringForKey(KEY_EPG_START);\r
+ for (int sh = 0; sh < 24; ++sh)\r
+ {\r
+ char sh_buf[64];\r
+ if ((sh_str != NULL) && (sh_str->length() == 5) && (sh_str->substringToIndex(2)->intValue() == sh))\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\" selected>%02d</option>", sh, sh);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sh_buf, "<option value=\"%02d\">%02d</option>", sh, sh);\r
+ }\r
+ controls += sh_buf;\r
+ }\r
+ controls += "</select>";\r
+ controls += "<select name=\"start_min\" size=\"1\">";\r
+ controls += "<option value=\"-\">--</option>";\r
+ for (int sm = 0; sm < 60; ++sm)\r
+ {\r
+ char sm_buf[64];\r
+ if ((sh_str != NULL) && (sh_str->length() == 5) && (sh_str->substringFromIndex(3)->intValue() == sm))\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\" selected>%02d</option>", sm, sm);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(sm_buf, "<option value=\"%02d\">%02d</option>", sm, sm);\r
+ }\r
+ controls += sm_buf;\r
+ }\r
+ controls += "</select>";\r
+ controls += "</span>";\r
+ controls += "</div>";\r
+\r
+ controls += "</fieldset>";\r
+\r
+ controls += "<input type=\"submit\" class=\"whiteButton\" name=\"req_mod\" value=\"";\r
+ controls += LocalizedString(KEY_I18N_Registration, NULL)->cString();\r
+ controls += "\">";\r
+\r
+ controls += "<input type=\"submit\" class=\"redButton\" name=\"req_del\" value=\"";\r
+ controls += LocalizedString(KEY_I18N_Delete, NULL)->cString();\r
+// controls += "\">";\r
+ controls += "\" onclick='return confirm(\"To delete. Is it ok?\");'>";\r
+\r
+ controls += "</form>";\r
+ }\r
+ }\r
+ }\r
+\r
+ contents += "</ul>";\r
+ contents += controls;\r
+\r
+ controls = "<form id=\"dialogForm\" title=\"";\r
+ controls += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ controls += LocalizedString(KEY_I18N_Add, NULL)->cString();\r
+ controls += "\" class=\"dialog\" target=\"_self\" action=\"add_keywords.cgi\" method=\"GET\">";\r
+ controls += "<fieldset>";\r
+ controls += "<h1>";\r
+ controls += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ controls += LocalizedString(KEY_I18N_Add, NULL)->cString();\r
+ controls += "</h1>";\r
+ controls += "<a class=\"button leftButton\" type=\"cancel\">Cancel</a>";\r
+ controls += "<a class=\"button blueButton\" type=\"submit\">Submit</a>";\r
+ controls += "<label>Parm1:</label>";\r
+ controls += "<input type=\"text\" name=\"keywords\" value=\"";\r
+// controls += LocalizedString(KEY_I18N_Keywords, NULL)->cString();\r
+ controls += "\"/>";\r
+ controls += "</fieldset>";\r
+ controls += "<div class=\"spinner\"></div>";\r
+ controls += "</form>";\r
+\r
+ contents += controls;\r
+ //\r
+ // キーワード:ここまで\r
+ //\r
+\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ if (html != NULL)\r
+ {\r
+ result = responseWithHTML(request, html);\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForStatus(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ HTTPResponse *result = NULL;\r
+ if ((request != NULL) && (client != NULL))\r
+ {\r
+ String *path = _httpd->rootPath()->stringByAppendingPathComponent("template2.html");\r
+ String *html = String::stringWithContentsOfFile(path->cString(), UTF8StringEncoding);\r
+ if (html != NULL)\r
+ {\r
+ html = html->stringByReplacingOccurrencesOfString("%%TITLE%%", LocalizedString(KEY_I18N_Tuner_Status, NULL));\r
+ std::string contents;\r
+ std::string status;\r
+ contents += "<ul id=\"home\" title=\"";\r
+ contents += LocalizedString(KEY_I18N_Tuner_Status, NULL)->cString();\r
+ contents += "\" selected=\"true\">";\r
+ DebugLog2("_tunerCount = %d", _tunerCount);\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ char key[4];\r
+ sprintf_s(key, sizeof(key), "%03d", i);\r
+\r
+ if (isTunerInitialized(i))\r
+ {\r
+ contents += "<li>";\r
+ contents += "<a href=\"#tuner";\r
+ contents += key;\r
+ contents += "\">";\r
+ contents += key;\r
+ contents += ": ";\r
+ contents += _tuners[i]->name();\r
+ contents += "</a></li>";\r
+\r
+ //\r
+ status += "<div id=\"";\r
+ status += "tuner";\r
+ status += key;\r
+ status += "\" title=\"";\r
+ status += _tuners[i]->name();\r
+ status += "\" class=\"panel\">";\r
+\r
+ status += "<h2>Status</h2>";\r
+ status += "<fieldset>";\r
+\r
+ // Tuner Type\r
+ status += "<div class=\"row\">";\r
+ status += "<label>Type</label>";\r
+ status += "<span>";\r
+ switch (_tuners[i]->type())\r
+ {\r
+ case Tuner::ISDB_S:\r
+ status += "ISDB-S";\r
+ break;\r
+ case Tuner::ISDB_T:\r
+ status += "ISDB-T";\r
+ break;\r
+ case Tuner::TYPE_NA:\r
+ default:\r
+ status += "N/A";\r
+ break;\r
+ }\r
+ status += "</span>";\r
+ status += "</div>";\r
+\r
+ // LnbPower\r
+ status += "<div class=\"row\">";\r
+ status += "<label>LnbPower</label>";\r
+ status += "<span>";\r
+ switch (_tuners[i]->lnbPower())\r
+ {\r
+ case Tuner::LNB_POWER_11V:\r
+ status += "11V";\r
+ break;\r
+ case Tuner::LNB_POWER_15V:\r
+ status += "15V";\r
+ break;\r
+ case Tuner::LNB_POWER_OFF:\r
+ default:\r
+ status += "OFF";\r
+ break;\r
+ }\r
+ status += "</span>";\r
+ status += "</div>";\r
+\r
+ // Channel\r
+ char tmpstr[32];\r
+ status += "<div class=\"row\">";\r
+ status += "<label>Channel</label>";\r
+ status += "<span>";\r
+ sprintf_s(tmpstr, sizeof(tmpstr), "%03d", _tuners[i]->channel());\r
+ status += tmpstr;\r
+ status += "</span>";\r
+ status += "</div>";\r
+\r
+ // C/N[dB] AGC xxx/255\r
+ uint32_t cn100 = 0;\r
+ uint32_t agc = 0;\r
+ uint32_t maxAgc = 0;\r
+ _tuners[i]->getCnAgc(&cn100, &agc, &maxAgc);\r
+\r
+ sprintf_s(tmpstr, sizeof(tmpstr), "%d.%02d[dB]", cn100 / 100, cn100 % 100);\r
+\r
+ status += "<div class=\"row\">";\r
+ status += "<label>C/N</label>";\r
+ status += "<span>";\r
+ status += tmpstr;\r
+ status += "</span>";\r
+ status += "</div>";\r
+\r
+ sprintf_s(tmpstr, sizeof(tmpstr), "%03d/%03d", agc, maxAgc);\r
+\r
+ status += "<div class=\"row\">";\r
+ status += "<label>AGC</label>";\r
+ status += "<span>";\r
+ status += tmpstr;\r
+ status += "</span>";\r
+ status += "</div>";\r
+\r
+ status += "</fieldset>";\r
+ status += "</div>";\r
+\r
+ }\r
+ else\r
+ {\r
+ contents += "<li>";\r
+ contents += _tuners[i]->name();\r
+ contents += "[uninitialized]";\r
+ contents += "</li>";\r
+ }\r
+ }\r
+ contents += "</ul>";\r
+ contents += status;\r
+ html = html->stringByReplacingOccurrencesOfString("%%CONTENTS%%", contents.c_str());\r
+ result = responseWithHTML(request, html);\r
+ }\r
+ else\r
+ {\r
+ DebugLog2("responseForStatus() html is null\n");\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForRegistCGI(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForRegistCGI()");\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // CGIリクエストとして解析\r
+ Dictionary *cgi = request->parseAsCGI();\r
+ if (cgi != NULL)\r
+ {\r
+ // CGIパスが一致しているか\r
+ if ((cgi->stringForKey(HTTPRequest::KEY_CGI) != NULL) && (cgi->stringForKey(HTTPRequest::KEY_CGI)->isEqualToString("/regist.cgi")))\r
+ {\r
+ // パラメータがあるか\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params != NULL)\r
+ {\r
+ // パラメータ数が2か\r
+ if (params->count() == 2)\r
+ {\r
+ // パラメータのチェック\r
+ String *service_id = NULL;\r
+ String *event_id = NULL;\r
+\r
+ for (uint i = 0; i < params->count(); ++i)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(i);\r
+ String *value = param->stringForKey("service_id");\r
+ if ((value != NULL) && value->isMatch("^\\d+$"))\r
+ {\r
+ service_id = value;\r
+ }\r
+ value = param->stringForKey("event_id");\r
+ if ((value != NULL) && value->isMatch("^\\d+$"))\r
+ {\r
+ event_id = value;\r
+ }\r
+ }\r
+\r
+ // 有効なパラメータか\r
+ if ((service_id != NULL) && (event_id != NULL))\r
+ {\r
+ DebugLog2("valid request");\r
+\r
+ result = responseByResult(request, reserve(service_id->intValue(), event_id->intValue()));\r
+ }\r
+ }\r
+\r
+ // パラメータ数が9か\r
+ else if (params->count() == 9)\r
+ {\r
+ // パラメータのチェック\r
+ String *service_id = NULL;\r
+ String *year = NULL;\r
+ String *month = NULL;\r
+ String *day = NULL;\r
+ String *start_hour = NULL;\r
+ String *start_min = NULL;\r
+ String *end_hour = NULL;\r
+ String *end_min = NULL;\r
+ String *repeat = NULL;\r
+\r
+ struct {\r
+ const char *name;\r
+ String **variable;\r
+ const char *regex;\r
+ }\r
+ cgi[] =\r
+ {\r
+ {"service_id", &service_id, "^\\d+$"},\r
+ {"year", &year, "^\\d{4}$"},\r
+ {"month", &month, "^([1-9]|1[0-2])$"},\r
+ {"day", &day, "^([1-9]|[12][0-9]|3[01])$"},\r
+ {"start_hour", &start_hour, "^\\d{2}$"},\r
+ {"start_min", &start_min, "^\\d{2}$"},\r
+ {"end_hour", &end_hour, "^\\d{2}$"},\r
+ {"end_min", &end_min, "^\\d{2}$"},\r
+ {"repeat", &repeat, "^(off|everyday|weekly|weekday)$"},\r
+ {NULL, NULL, NULL}\r
+ };\r
+\r
+ for (uint i = 0; cgi[i].name != NULL; ++i)\r
+ {\r
+ for (uint j = 0; j < params->count(); ++j)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(j);\r
+ String *value = param->stringForKey(cgi[i].name);\r
+ if ((value != NULL) && value->isMatch(cgi[i].regex))\r
+ {\r
+ *(cgi[i].variable) = value;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // 有効なパラメータか\r
+ if ((service_id != NULL) && (year != NULL) && (month != NULL) && (day != NULL) &&\r
+ (start_hour != NULL) && (start_min != NULL) && (end_hour != NULL) && (end_min != NULL) && (repeat != NULL))\r
+ {\r
+ //\r
+ DebugLog1("valid param");\r
+\r
+ Dictionary *epg = Dictionary::dictionaryWithCapacity(0);\r
+\r
+ // 日付\r
+ epg->setString(String::stringWithFormat("%s/%02d/%02d", year->cString(), month->intValue(), day->intValue()), KEY_EPG_DATE);\r
+\r
+ // 開始時刻\r
+ epg->setString(String::stringWithFormat("%s:%s:00", start_hour->cString(), start_min->cString()), KEY_EPG_START);\r
+\r
+ // 終了時刻\r
+ epg->setString(String::stringWithFormat("%s:%s:00", end_hour->cString(), end_min->cString()), KEY_EPG_END);\r
+\r
+ // 繰り返し\r
+ epg->setString(repeat, KEY_EPG_REPEAT);\r
+\r
+ // Service ID\r
+ epg->setString(service_id, KEY_EPG_SERVICE_ID);\r
+\r
+ // Status\r
+ epg->setString("ready", KEY_EPG_STATUS);\r
+\r
+ result = responseByResult(request, reserve(epg));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForCancelCGI(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForCancelCGI()");\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // CGIリクエストとして解析\r
+ Dictionary *cgi = request->parseAsCGI();\r
+ if (cgi != NULL)\r
+ {\r
+ // CGIパスが一致しているか\r
+ if ((cgi->stringForKey(HTTPRequest::KEY_CGI) != NULL) && (cgi->stringForKey(HTTPRequest::KEY_CGI)->isEqualToString("/cancel.cgi")))\r
+ {\r
+ // パラメータがあるか\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params != NULL)\r
+ {\r
+ // パラメータ数が1か\r
+ if (params->count() == 1)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(0);\r
+ String *value = param->stringForKey("resv_id");\r
+ if ((value != NULL) && value->isMatch("^\\d{6}$"))\r
+ {\r
+ result = responseByResult(request, cancel(-1, value->intValue()));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForAddKeywordsCGI(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForAddKeywordsCGI()");\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // CGIリクエストとして解析\r
+ Dictionary *cgi = request->parseAsCGI();\r
+ if (cgi != NULL)\r
+ {\r
+ // CGIパスが一致しているか\r
+ if ((cgi->stringForKey(HTTPRequest::KEY_CGI) != NULL) && (cgi->stringForKey(HTTPRequest::KEY_CGI)->isEqualToString("/add_keywords.cgi")))\r
+ {\r
+ // パラメータがあるか\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params != NULL)\r
+ {\r
+ // パラメータ数が1か\r
+ if (params->count() == 1)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(0);\r
+ String *value = param->stringForKey("keywords");\r
+ if (value != NULL)\r
+ {\r
+ value = value->stringByReplacingOccurrencesOfString("+", " ");\r
+ if (value != NULL)\r
+ {\r
+ value = value->stringByRemovingPercentEncoding();\r
+ }\r
+ }\r
+ if (value != NULL)\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *keywords_info = _reservations->dictionaryForKey(KEY_EPG_KEYWORDS);\r
+ if (keywords_info == NULL)\r
+ {\r
+ keywords_info = Dictionary::dictionaryWithCapacity(0);\r
+ _reservations->setObject(keywords_info, KEY_EPG_KEYWORDS);\r
+ }\r
+\r
+ if (keywords_info->dictionaryForKey(value) == NULL)\r
+ {\r
+ // 新規キーワードの場合\r
+ keywords_info->setObject(Dictionary::dictionaryWithCapacity(0), value);\r
+\r
+ // キーワード予約更新\r
+ updateKeywordsReservation();\r
+\r
+ // スケジュール更新\r
+ updateSchedule();\r
+\r
+ // 保存\r
+ _reservations->writeToFile(_reservations_path, true);\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ result = responseForReloadURI(request, client, "/reservation.html#_keywords");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForModKeywordsCGI(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("Controller::responseForModKeywordsCGI()");\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // CGIリクエストとして解析\r
+ Dictionary *cgi = request->parseAsCGI();\r
+ if (cgi != NULL)\r
+ {\r
+ DebugLog3("cgi != NULL");\r
+\r
+ // CGIパスが一致しているか\r
+ if ((cgi->stringForKey(HTTPRequest::KEY_CGI) != NULL) && (cgi->stringForKey(HTTPRequest::KEY_CGI)->isEqualToString("/mod_keywords.cgi")))\r
+ {\r
+ DebugLog3("CGI path OK.");\r
+\r
+ // パラメータがあるか\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params != NULL)\r
+ {\r
+ DebugLog3("params != NULL");\r
+\r
+ // パラメータのチェック\r
+ String *keywords = NULL;\r
+ String *service_id = NULL;\r
+ String *start_hour = NULL;\r
+ String *start_min = NULL;\r
+ String *req_mod = NULL;\r
+ String *req_del = NULL;\r
+\r
+ struct {\r
+ const char *name;\r
+ String **variable;\r
+ const char *regex;\r
+ }\r
+ cgi[] =\r
+ {\r
+ {"keywords", &keywords, ".*"},\r
+ {"service_id", &service_id, "^(\\d+|-)$"},\r
+ {"start_hour", &start_hour, "^(\\d{2}|-)$"},\r
+ {"start_min", &start_min, "^(\\d{2}|-)$"},\r
+ {"req_mod", &req_mod, ".*"},\r
+ {"req_del", &req_del, ".*"},\r
+ {NULL, NULL, NULL}\r
+ };\r
+\r
+ for (uint i = 0; cgi[i].name != NULL; ++i)\r
+ {\r
+ for (uint j = 0; j < params->count(); ++j)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(j);\r
+ String *value = param->stringForKey(cgi[i].name);\r
+ if ((value != NULL) && value->isMatch(cgi[i].regex))\r
+ {\r
+ *(cgi[i].variable) = value;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (keywords != NULL)\r
+ {\r
+ keywords = keywords->stringByReplacingOccurrencesOfString("+", " ");\r
+ if (keywords != NULL)\r
+ {\r
+ keywords = keywords->stringByRemovingPercentEncoding();\r
+ }\r
+ }\r
+\r
+ if ((keywords != NULL) && (service_id != NULL) && (start_hour != NULL) && (start_min != NULL) &&\r
+ ((req_mod != NULL) && (req_del == NULL)) || ((req_mod == NULL) && (req_del != NULL)))\r
+ {\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *keywords_info = _reservations->dictionaryForKey(KEY_EPG_KEYWORDS);\r
+ if (keywords_info != NULL)\r
+ {\r
+ if (req_mod != NULL)\r
+ {\r
+ DebugLog0("keywords: %s", keywords->cString());\r
+ DebugLog0("service_id: %s", service_id->cString());\r
+ DebugLog0("start_hour: %s", start_hour->cString());\r
+ DebugLog0("start_min: %s", start_min->cString());\r
+ Dictionary *kwd_inf = keywords_info->dictionaryForKey(keywords);\r
+ if (kwd_inf != NULL)\r
+ {\r
+ if (!service_id->isEqualToString("-"))\r
+ {\r
+ kwd_inf->setString(service_id, KEY_EPG_SERVICE_ID);\r
+ }\r
+ else\r
+ {\r
+ kwd_inf->removeObjectForKey(KEY_EPG_SERVICE_ID);\r
+ }\r
+ if (!start_hour->isEqualToString("-") && !start_min->isEqualToString("-"))\r
+ {\r
+ kwd_inf->setString(String::stringWithFormat("%s:%s", start_hour->cString(), start_min->cString()), KEY_EPG_START);\r
+ }\r
+ else\r
+ {\r
+ kwd_inf->removeObjectForKey(KEY_EPG_START);\r
+ }\r
+ }\r
+ }\r
+ else if (req_del != NULL)\r
+ {\r
+ DebugLog0("keywords: %s", keywords->cString());\r
+ keywords_info->removeObjectForKey(keywords);\r
+ }\r
+\r
+ // キーワード予約更新\r
+ updateKeywordsReservation();\r
+\r
+ // スケジュール更新\r
+ updateSchedule();\r
+\r
+ // 保存\r
+ _reservations->writeToFile(_reservations_path, true);\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ result = responseForReloadURI(request, client, "/reservation.html#_keywords");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForReloadURI(NET::HTTPRequest *request, SOCKADDR_IN *client, const char *uri, int sec)\r
+{\r
+ HTTPResponse *result = NULL;\r
+\r
+ if (uri != NULL)\r
+ {\r
+ std::string contents;\r
+ contents = "<html>";\r
+ contents += "<head>";\r
+#if 0\r
+ contents += "<meta http-equiv=\"refresh\" content=\"0;URL=";\r
+#else\r
+ contents += "<meta http-equiv=\"refresh\" content=\"";\r
+ char tmp[16];\r
+ sprintf_s(tmp, "%d", sec);\r
+ contents += tmp;\r
+ contents += ";URL=";\r
+#endif\r
+ contents += uri;\r
+ contents += "\">";\r
+ contents += "</head>";\r
+ contents += "</html>";\r
+ String *html = String::stringWithUTF8String(contents.c_str());\r
+ if (html != NULL)\r
+ {\r
+ result = responseWithHTML(request, html);\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForPlaylist(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ HTTPResponse *result = NULL;\r
+\r
+ char hostname[NI_MAXHOST];\r
+ if (getnameinfo((SOCKADDR *)client, sizeof(SOCKADDR_IN), hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)\r
+ {\r
+ if (_props->stringForKey(KEY_HTTP_HOST)->isEqualToString(hostname) || strcmp("127.0.0.1", hostname) == 0)\r
+ {\r
+ if (_iptv_m3u8_local != NULL)\r
+ {\r
+ result = responseWithUTF8Text(request, _iptv_m3u8_local);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (_iptv_m3u8_remote != NULL)\r
+ {\r
+ result = responseWithUTF8Text(request, _iptv_m3u8_remote);\r
+ }\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::responseForXmltv(HTTPRequest *request, SOCKADDR_IN *client)\r
+{\r
+ HTTPResponse *result = NULL;\r
+\r
+ std::string str_xmltv_xml;\r
+ str_xmltv_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";\r
+ str_xmltv_xml += "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\r\n";\r
+ str_xmltv_xml += "<tv generator-info-name=\"iPTd_R2\" generator-info-url=\"http://localhost/\">\r\n";\r
+ str_xmltv_xml += _xmltv_channels;\r
+\r
+ Dictionary *temp_data = _epgs->dictionaryForKey(KEY_TEMP_DATA);\r
+ if (temp_data != NULL)\r
+ {\r
+ Array *keys = temp_data->allKeys();\r
+ for (uint i = 0; i < keys->count(); ++i)\r
+ {\r
+ Dictionary *temp_service = temp_data->dictionaryForKey((String *)keys->objectAtIndex(i));\r
+ if (temp_service != NULL)\r
+ {\r
+ String *xmltv_programs = temp_service->stringForKey(KEY_PROGRAMS);\r
+ if (xmltv_programs != NULL)\r
+ {\r
+ str_xmltv_xml += xmltv_programs->cString();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ str_xmltv_xml += "</tv>\r\n";\r
+\r
+ String *tmp = String::stringWithUTF8String(str_xmltv_xml.c_str());\r
+ if (tmp != NULL)\r
+ {\r
+ result = responseWithUTF8Text(request, tmp);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+/**\r
+ * @brief HTTP Live Streaming制御\r
+ *\r
+ * http://hogehoge/チューナ番号_サービスID/streaming[-プリセット名].m3u8 がリクエスト(プリセットはオプション)され、\r
+ * チューナ番号/サービスID/プリセット名(ある場合)が有効値の場合にコールされる\r
+ *\r
+ * @param [in] request HTTPリクエスト\r
+ * @param [in] client リクエストしたクライアントのアドレス\r
+ * @param [in] tuner チューナ番号\r
+ * @param [in] service_id チャンネル番号\r
+ * @param [in] preset プリセット(URLで省略された場合 "default" )\r
+ */\r
+HTTPResponse *Controller::responseForHLSControl(HTTPRequest *request, SOCKADDR_IN *client, int tuner, int service_id, String *preset)\r
+{\r
+ DebugLog2("Controller::responseForHLSControl()");\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // client からホスト名を取得\r
+ char hostname[NI_MAXHOST];\r
+ if (getnameinfo((SOCKADDR *)client, sizeof(SOCKADDR_IN), hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)\r
+ {\r
+ // ストリーミング制御情報からHLS情報を取得\r
+ Dictionary *hls_info = _streaming_ctrls->dictionaryForKey(KEY_HLS_INFO);\r
+ if (hls_info == NULL)\r
+ {\r
+ hls_info = Dictionary::dictionaryWithCapacity(0);\r
+ _streaming_ctrls->setObject(hls_info, KEY_HLS_INFO);\r
+ }\r
+\r
+ // HLS情報から指定チューナの情報を取得\r
+ Dictionary *hls_info_tuner = hls_info->dictionaryForKey(_tuners[tuner]->name());\r
+ if (hls_info_tuner == NULL)\r
+ {\r
+ hls_info_tuner = Dictionary::dictionaryWithCapacity(0);\r
+ hls_info->setObject(hls_info_tuner, _tuners[tuner]->name());\r
+ }\r
+\r
+ // 指定チューナの情報からホスト名を確認\r
+ if ((hls_info_tuner->stringForKey(KEY_HOSTNAME) == NULL) || hls_info_tuner->stringForKey(KEY_HOSTNAME)->isEqualToString(hostname))\r
+ {\r
+ // ホスト名を設定\r
+ hls_info_tuner->setString(hostname, KEY_HOSTNAME);\r
+\r
+ RaymLock(this);\r
+ if (!_tuners[tuner]->isRecording() && !_tuners[tuner]->isStreaming() && _tuners[tuner]->isLocked())\r
+ {\r
+ if (_tuners[tuner]->type() == Tuner::ISDB_S)\r
+ {\r
+ _cancel_epg_collect_s = true;\r
+ }\r
+ else\r
+ {\r
+ _cancel_epg_collect_t = true;\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+\r
+ // HLS制御インスタンス取得\r
+ HTTPLiveStreaming *hls = (HTTPLiveStreaming *)hls_info_tuner->objectForKey(KEY_HLS_INSTANCE);\r
+ if (hls == NULL)\r
+ {\r
+ // 生成\r
+ hls = HTTPLiveStreaming::alloc()->init()->autorelease();\r
+ hls_info_tuner->setObject(hls, KEY_HLS_INSTANCE);\r
+ }\r
+\r
+ char tuner_and_service_id[10];\r
+ sprintf_s(tuner_and_service_id, "%03d_%d", tuner, service_id);\r
+\r
+ // 異チャンネルへのリクエスト、または、プリセット変更の場合\r
+ if (((hls_info_tuner->stringForKey(KEY_CHANNEL) != NULL) && !hls_info_tuner->stringForKey(KEY_CHANNEL)->isEqualToString(tuner_and_service_id)) ||\r
+ ((hls_info_tuner->stringForKey(KEY_PRESET) != NULL) && !hls_info_tuner->stringForKey(KEY_PRESET)->isEqualToString(preset)))\r
+ {\r
+ // 停止\r
+ hls->stop();\r
+\r
+ // チャンネルとプリセットは一旦削除\r
+ hls_info_tuner->removeObjectForKey(KEY_CHANNEL);\r
+ hls_info_tuner->removeObjectForKey(KEY_PRESET);\r
+ }\r
+\r
+ // 初回リクエスト or チャンネル/プリセット変更 か?\r
+ if ((hls_info_tuner->stringForKey(KEY_CHANNEL) == NULL) && (hls_info_tuner->stringForKey(KEY_PRESET) == NULL))\r
+ {\r
+ // UDPポートを検索\r
+ Dictionary *mapping = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_UDP_TO_TUNER_SERVICE_ID);\r
+ if (mapping != NULL)\r
+ {\r
+ Array *ports = mapping->allKeys();\r
+ if (ports != NULL)\r
+ {\r
+ for (uint i = 0; i < ports->count(); ++i)\r
+ {\r
+ String *port = (String *)ports->objectAtIndex(i);\r
+ String *tmp = mapping->stringForKey(port);\r
+ if (tmp->isEqualToString(tuner_and_service_id))\r
+ {\r
+ DebugLog0("udp mapping %d -> %s", port->intValue(), tuner_and_service_id);\r
+\r
+ // ソースを設定\r
+ hls->setSource(String::stringWithFormat("udp://@0.0.0.0:%d", port->intValue()));\r
+\r
+ // トランスコード\r
+// hls->setTranscode(_props->dictionaryForKey(KEY_PRESETS)->dictionaryForKey(preset));\r
+\r
+ // 出力先を設定\r
+ String *outpath = _props->stringForKey(KEY_CACHE_PATH)->stringByAppendingPathComponent(String::stringWithFormat("%03d", tuner));\r
+ _mkdir(outpath->cString());\r
+ hls->setOutputPath(outpath);\r
+\r
+ // インデックス名\r
+ hls->setIndexName(String::stringWithFormat("live_%s", tuner_and_service_id));\r
+\r
+ // 開始\r
+ if (hls->start())\r
+ {\r
+ DebugLog0("hls->start() success");\r
+\r
+ // チャンネルを保存\r
+ hls_info_tuner->setString(tuner_and_service_id, KEY_CHANNEL);\r
+\r
+ // プリセットを保存\r
+ hls_info_tuner->setString(preset, KEY_PRESET);\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ String *index_path = hls->indexPath();\r
+ FileManager *fm = FileManager::defaultManager();\r
+ int count = 0;\r
+ while (count++ < 5)\r
+ {\r
+ bool isDirectory = false;\r
+ if (fm->fileExistsAtPath(index_path, &isDirectory))\r
+ {\r
+ if (!isDirectory)\r
+ {\r
+ DebugLog0("file exists");\r
+ bool done = false;\r
+ while (!done)\r
+ {\r
+ RaymLock(this);\r
+ result = _httpd->responseWithPath(index_path, request);\r
+ RaymUnlock(this);\r
+ if (result != NULL)\r
+ {\r
+ break;\r
+ }\r
+ ::Sleep(100);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ ::Sleep(1000);\r
+ }\r
+\r
+ RaymLock(this);\r
+\r
+ hls_info_tuner->setInteger(0, KEY_COUNTER);\r
+\r
+ if (result == NULL)\r
+ {\r
+ DebugLog0("file no exists");\r
+ result = responseForReloadURI(request, client, request->URI()->cString(), 10);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // 他ホストが使用中\r
+ }\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::requestTunerControl(HTTPRequest *request, SOCKADDR_IN *client, int tuner)\r
+{\r
+ DebugLog2("%s\n", __FUNCTION__);\r
+\r
+ HTTPResponse *result = NULL;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // URI取得\r
+ String *uri = request->URI();\r
+ while (uri != NULL)\r
+ {\r
+ // CGIリクエストとして解析\r
+ Dictionary *cgi = request->parseAsCGI();\r
+ if (cgi != NULL)\r
+ {\r
+ uri = cgi->stringForKey(HTTPRequest::KEY_CGI);\r
+ if (uri == NULL)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ DebugLog0("uri: %s", uri->cString());\r
+\r
+ //\r
+ // チューナ情報\r
+ //\r
+ if (uri->isMatch("^/[0-9]{3}/info.xml$") && (cgi == NULL))\r
+ {\r
+ }\r
+\r
+ //\r
+ // チャンネル設定\r
+ // /ttt/channel=nnn\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/channel=[0-9]{1,3}$") && (cgi == NULL))\r
+ {\r
+DebugLog0("ch set");\r
+ String *ch = uri->substringFromIndex(13);\r
+ if (ch == NULL)\r
+ {\r
+ break;\r
+ }\r
+ int channel = ch->intValue();\r
+DebugLog0("set %d channel:%d(%s)\n", tuner, channel, ch->cString());\r
+ DebugLog2("set channel:%d(%s)\n", channel, ch->cString());\r
+ if (setChannel(tuner, channel))\r
+ {\r
+ // success\r
+ DebugLog2("success.\n");\r
+ result = responseForSuccess(request);\r
+ }\r
+ else\r
+ {\r
+ // failed\r
+ DebugLog2("failed.\n");\r
+ result = responseForFailed(request);\r
+ }\r
+ }\r
+\r
+ //\r
+ // 録画開始(最大23:59まで)\r
+ // /ttt/recording=on?hour=hh&min=mm[&channel=nnn]\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/recording=on$") && (cgi != NULL))\r
+ {\r
+ // パラメータがあるか\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ // パラメータ数は2〜3か\r
+ if ((params->count() != 2) && (params->count() != 3))\r
+ {\r
+ break;\r
+ }\r
+\r
+ // パラメータのチェック\r
+ String *p_hour = NULL;\r
+ String *p_min = NULL;\r
+ String *p_channel = NULL;\r
+\r
+ struct {\r
+ const char *name;\r
+ String **variable;\r
+ const char *regex;\r
+ }\r
+ cgi[] =\r
+ {\r
+ {"hour", &p_hour, "^[0-2][0-9]$"},\r
+ {"min", &p_min, "^[0-5][0-9]$"},\r
+ {"channel", &p_channel, "^[0-9]{3}$"},\r
+ {NULL, NULL, NULL}\r
+ };\r
+\r
+ for (uint i = 0; cgi[i].name != NULL; ++i)\r
+ {\r
+ *(cgi[i].variable) = NULL;\r
+ for (uint j = 0; j < params->count(); ++j)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(j);\r
+ String *value = param->stringForKey(cgi[i].name);\r
+ if ((value != NULL) && value->isMatch(cgi[i].regex))\r
+ {\r
+ *(cgi[i].variable) = value;\r
+ }\r
+ }\r
+ }\r
+\r
+ // パラメータは有効か\r
+ if ((p_hour == NULL) || (p_min == NULL))\r
+ {\r
+ break;\r
+ }\r
+\r
+ // チャンネル設定\r
+ int channel = 0;\r
+ if (p_channel != NULL)\r
+ {\r
+ channel = p_channel->intValue();\r
+ }\r
+ else\r
+ {\r
+ channel = _tuners[tuner]->channel();\r
+ }\r
+\r
+ if (channel >= 0)\r
+ {\r
+ // recording on\r
+ int hour = p_hour->intValue();\r
+ int min = p_min->intValue();\r
+ if (hour < 24)\r
+ {\r
+ // EPG生成\r
+ Dictionary *epg = Dictionary::dictionaryWithCapacity(0);\r
+ while (true)\r
+ {\r
+ time_t now;\r
+ time(&now);\r
+ now += 1; // margin\r
+ TM tm;\r
+ if (localtime_s(&tm, &now) != 0)\r
+ {\r
+ epg = NULL;\r
+ break;\r
+ }\r
+ TM end;\r
+ end = tm;\r
+ end.tm_hour += hour;\r
+ end.tm_min += min;\r
+ end.tm_sec += 1; // margin\r
+ if (mktime(&end) == -1)\r
+ {\r
+ epg = NULL;\r
+ break;\r
+ }\r
+\r
+ char tmp[16];\r
+\r
+ // Date\r
+ sprintf_s(tmp, sizeof(tmp), "%04d/%02d/%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);\r
+ epg->setString(tmp, KEY_EPG_DATE);\r
+\r
+ // Start\r
+ sprintf_s(tmp, sizeof(tmp), "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);\r
+ epg->setString(tmp, KEY_EPG_START);\r
+\r
+ // End\r
+ sprintf_s(tmp, sizeof(tmp), "%02d:%02d:%02d", end.tm_hour, end.tm_min, end.tm_sec);\r
+ epg->setString(tmp, KEY_EPG_END);\r
+\r
+ // Channel\r
+ sprintf_s(tmp, sizeof(tmp), "%d", channel);\r
+ epg->setString(tmp, KEY_EPG_CHANNEL);\r
+\r
+ // 繰り返し\r
+ epg->setString("off", KEY_EPG_REPEAT); \r
+\r
+ // Status\r
+ epg->setString("ready", KEY_EPG_STATUS);\r
+\r
+ break;\r
+ }\r
+ \r
+ if (epg != NULL)\r
+ {\r
+ // 録画開始&結果生成\r
+ result = responseByResult(request, reserve(tuner, epg));\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // 録画停止\r
+ // /ttt/recording=off\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/recording=off$") && (cgi == NULL))\r
+ {\r
+ // recording off\r
+ DebugLog2("recording off: %s\n", uri->cString());\r
+ if (cancel(tuner, -1))\r
+ {\r
+ // success\r
+ DebugLog2("success.\n");\r
+ result = responseForSuccess(request);\r
+ }\r
+ else\r
+ {\r
+ // failed\r
+ DebugLog2("failed.\n");\r
+ result = responseForFailed(request);\r
+ }\r
+ }\r
+\r
+ //\r
+ // ストリーミング開始\r
+ // /ttt/streaming=on?udp=nnnnn[&host=aaaaaa][&sid=sssss]\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/streaming=on$") && (cgi != NULL))\r
+ {\r
+ //\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if ((params == NULL) || (params->count() < 0) || (params->count() > 3))\r
+ {\r
+ break;\r
+ }\r
+\r
+ //\r
+ String *p_udp = NULL;\r
+ String *p_host = NULL;\r
+ String *p_sid = NULL;\r
+\r
+ struct {\r
+ const char *name;\r
+ String **variable;\r
+ const char *regex;\r
+ }\r
+ cgi[] =\r
+ {\r
+ {"udp", &p_udp, "^[0-9]{1,5}$"},\r
+ {"host", &p_host, "^.+$"},\r
+ {"sid", &p_sid, "^[0-9]{1,5}$"},\r
+ {NULL, NULL, NULL}\r
+ };\r
+\r
+ for (uint i = 0; cgi[i].name != NULL; ++i)\r
+ {\r
+ *(cgi[i].variable) = NULL;\r
+ for (uint j = 0; j < params->count(); ++j)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(j);\r
+ String *value = param->stringForKey(cgi[i].name);\r
+ if ((value != NULL) && value->isMatch(cgi[i].regex))\r
+ {\r
+ *(cgi[i].variable) = value;\r
+ }\r
+ }\r
+ }\r
+\r
+ // パラメータチェック\r
+ if (p_udp == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ SOCKADDR_IN dst_addr;\r
+ \r
+ if (p_host != NULL)\r
+ {\r
+ #if 0\r
+ std::string host = udpstr.substr(idx + 5);\r
+ udpstr = udpstr.substr(0, idx - 1);\r
+ DebugLog2("udp: %s\n", udpstr.c_str());\r
+ DebugLog2("host: %s\n", host.c_str());\r
+ struct hostent *ent = gethostbyname(host.c_str());\r
+ #endif\r
+ }\r
+ else\r
+ {\r
+ memcpy(&dst_addr, client, sizeof(SOCKADDR_IN));\r
+ }\r
+ dst_addr.sin_port = htons(p_udp->intValue());\r
+\r
+ if (p_sid == NULL)\r
+ {\r
+ if (_tuners[tuner]->startStreaming(&dst_addr))\r
+ {\r
+ // success\r
+ DebugLog2("success.\n");\r
+ result = responseForSuccess(request);\r
+ }\r
+ else\r
+ {\r
+ // failed\r
+ DebugLog2("failed.\n");\r
+ result = responseForFailed(request);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("sid: %s", p_sid->cString());\r
+ DebugLog0("sid: %d", p_sid->intValue());\r
+ result = responseForFailed(request);\r
+ }\r
+ }\r
+\r
+ //\r
+ // ストリーミング停止\r
+ // /ttt/streaming=off(?host=aaaa)\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/streaming=off$"))\r
+ {\r
+ // パラメータ\r
+ String *p_host = NULL;\r
+\r
+ // パラメータがあるか\r
+ if (cgi != NULL)\r
+ {\r
+ Array *params = cgi->arrayForKey(HTTPRequest::KEY_PARAMS);\r
+ if (params == NULL)\r
+ {\r
+ break;\r
+ }\r
+\r
+ // パラメータ数は0〜1か\r
+ if ((params->count() != 0) && (params->count() != 1))\r
+ {\r
+ break;\r
+ }\r
+\r
+ struct {\r
+ const char *name;\r
+ String **variable;\r
+ const char *regex;\r
+ }\r
+ cgi[] =\r
+ {\r
+ {"host", &p_host, "^.+$"},\r
+ {NULL, NULL, NULL}\r
+ };\r
+\r
+ for (uint i = 0; cgi[i].name != NULL; ++i)\r
+ {\r
+ *(cgi[i].variable) = NULL;\r
+ for (uint j = 0; j < params->count(); ++j)\r
+ {\r
+ Dictionary *param = (Dictionary *)params->objectAtIndex(j);\r
+ String *value = param->stringForKey(cgi[i].name);\r
+ if ((value != NULL) && value->isMatch(cgi[i].regex))\r
+ {\r
+ *(cgi[i].variable) = value;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ SOCKADDR_IN dst_addr;\r
+ if (p_host != NULL)\r
+ {\r
+ }\r
+ else\r
+ {\r
+ }\r
+\r
+ _tuners[tuner]->stopStreaming();\r
+ \r
+ // success\r
+ DebugLog2("success.\n");\r
+ result = responseForSuccess(request);\r
+ }\r
+\r
+ //\r
+ // HLS制御\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/[0-9]+/streaming(-[^\\.]+)?.m3u8$") && (cgi == NULL))\r
+ {\r
+ // URIからサービスIDを抽出\r
+ Range r = uri->rangeOfString("/streaming");\r
+ int service_id = uri->substringToIndex(r.location)->substringFromIndex(5)->intValue();\r
+\r
+ // presetが指定されている場合、presetを抽出\r
+ String *preset = NULL;\r
+ if (uri->isMatch("streaming-"))\r
+ {\r
+ preset = uri->substringFromIndex(r.location + 11);\r
+ preset = preset->substringToIndex(preset->length() - 5);\r
+ }\r
+ else\r
+ {\r
+ // なければ "default"\r
+ preset = String::stringWithUTF8String(KEY_DEFAULT);\r
+ }\r
+\r
+ // チャンネル/presetが有効か確認\r
+ Dictionary *mapping = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_TUNER_SERVICE_ID_TO_UDP);\r
+ if ((mapping != NULL) && (mapping->stringForKey(String::stringWithFormat("%03d_%d", tuner, service_id)) != NULL) &&\r
+ (_props->dictionaryForKey(KEY_PRESETS) != NULL) &&\r
+ (_props->dictionaryForKey(KEY_PRESETS)->objectForKey(preset) != NULL))\r
+ {\r
+ // \r
+ result = responseForHLSControl(request, client, tuner, service_id, preset);\r
+ }\r
+ else\r
+ {\r
+ result = responseForFailed(request);\r
+ }\r
+ }\r
+ else if (uri->isMatch("^/[0-9]{3}/[0-9]+/streaming-[0-9]+.ts$") && (cgi == NULL))\r
+ {\r
+ // URIからサービスIDを抽出\r
+ Range r = uri->rangeOfString("/streaming");\r
+ int service_id = uri->substringToIndex(r.location)->substringFromIndex(5)->intValue();\r
+\r
+ // client からホスト名を取得\r
+ char hostname[NI_MAXHOST];\r
+ if (getnameinfo((SOCKADDR *)client, sizeof(SOCKADDR_IN), hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)\r
+ {\r
+ Dictionary *hls_info = _streaming_ctrls->dictionaryForKey(KEY_HLS_INFO);\r
+ if (hls_info != NULL)\r
+ {\r
+ Dictionary *hls_info_tuner = hls_info->dictionaryForKey(_tuners[tuner]->name());\r
+ if (hls_info_tuner != NULL)\r
+ {\r
+ if (hls_info_tuner->stringForKey(KEY_HOSTNAME)->isEqualToString(hostname) &&\r
+ hls_info_tuner->stringForKey(KEY_CHANNEL)->isEqualToString(String::stringWithFormat("%03d_%d", tuner, service_id)))\r
+ {\r
+ String *path = ((HTTPLiveStreaming *)hls_info_tuner->objectForKey(KEY_HLS_INSTANCE))->outputPath();\r
+ if (path != NULL)\r
+ {\r
+ result = _httpd->responseWithPath(path->stringByAppendingPathComponent(uri->substringFromIndex(r.location + 1)), request);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::requestRTSP(RTSPRequest *request, SOCKET sock, SOCKADDR_IN *client)\r
+{\r
+ HTTPResponse *result = NULL;\r
+\r
+ static int streaming_port = 0;\r
+\r
+ String *uri = request->URI();\r
+ if (uri->isMatch("^rtsp://[^/]+(:\\d+)/[0-9]{3}/[0-9]+/streaming.sdp/?$"))\r
+ {\r
+ if (request->method()->isEqualToString("OPTIONS"))\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+\r
+ InternetTextMessageHeader *header =InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("CSeq"), String::stringWithUTF8String("CSeq"));\r
+ header->setFieldBodyWithName(String::stringWithUTF8String("DESCRIBE, SETUP, TEARDOWN, PLAY"), String::stringWithUTF8String("Public"));\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, NULL);\r
+ RELEASE(header);\r
+\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ else if (request->method()->isEqualToString("DESCRIBE"))\r
+ {\r
+ String *accept = request->message()->header()->fieldBodyForName("Accept");\r
+ if ((accept != NULL) && accept->isMatch("application/sdp"))\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+\r
+ InternetTextMessageHeader *header =InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("CSeq"), "CSeq");\r
+ header->setFieldBodyWithName("23 Jan 2007 15:35:06 JST", "Date");\r
+ header->setFieldBodyWithName("application/sdp", "Content-Type");\r
+\r
+ std::string str_body;\r
+ str_body = "v=0\r\n"; // プロトコルのバージョン\r
+ str_body += "o=hoge 1234 5678 IN IP4 172.19.29.9\r\n"; // 発信元およびセッション識別子\r
+ str_body += "s=test\r\n"; // セッション名\r
+ str_body += "c=IN IP4 172.19.29.9\r\n"; // \r
+ str_body += "t=0 0\r\n";\r
+ str_body += "a=control:*\r\n";\r
+ str_body += "a=range:npt=0-\r\n";\r
+ str_body += "m=video 0 RAW/RAW/UDP 33\r\n";\r
+\r
+ // Content-Length\r
+ header->setFieldBodyWithName(String::stringWithFormat("%I64u", str_body.length()), "Content-Length");\r
+\r
+ InternetTextMessageBody *body = InternetTextMessageBody::alloc()->initWithString(String::stringWithUTF8String(str_body.c_str()));\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);\r
+ RELEASE(header);\r
+ RELEASE(body);\r
+\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ else if (request->method()->isEqualToString("SETUP"))\r
+ {\r
+ String *transport = request->message()->header()->fieldBodyForName("Transport");\r
+ if ((transport != NULL) && transport->isMatch("UDP.*;unicast;client_port=\\d+"))\r
+ {\r
+ Range r = transport->rangeOfString("_port=");\r
+ String *port = transport->substringFromIndex(r.location + 6);\r
+ r = port->rangeOfString("-");\r
+ port = port->substringToIndex(r.location);\r
+ DebugLog0("port: %s", port->cString());\r
+ streaming_port = port->intValue();\r
+\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+\r
+ InternetTextMessageHeader *header =InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("CSeq"), "CSeq");\r
+ header->setFieldBodyWithName("12345678", "Session");\r
+ String *tr = transport->stringByAppendingString(";server_port=50020-50021");\r
+ header->setFieldBodyWithName(tr, "Transport");\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, NULL);\r
+ RELEASE(header);\r
+\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ else if (request->method()->isEqualToString("PLAY"))\r
+ {\r
+ String *range = request->message()->header()->fieldBodyForName("Range");\r
+ if (range != NULL)\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+\r
+ InternetTextMessageHeader *header =InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("CSeq"), "CSeq");\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("Session"), "Session");\r
+ header->setFieldBodyWithName(range, "Range");\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, NULL);\r
+ RELEASE(header);\r
+\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+\r
+ SOCKADDR_IN dst_addr;\r
+\r
+ dst_addr.sin_family = AF_INET;\r
+ dst_addr.sin_addr.s_addr = htonl(0xac131d01);\r
+ dst_addr.sin_port = htons(streaming_port);\r
+\r
+ if (_tuners[1]->startStreaming(&dst_addr))\r
+ {\r
+ DebugLog0("streaming start ok");\r
+ }\r
+ }\r
+ }\r
+ else if (request->method()->isEqualToString("TEARDOWN"))\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_OK);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_OK));\r
+\r
+ InternetTextMessageHeader *header =InternetTextMessageHeader::alloc()->init();\r
+ header->setFieldBodyWithName(request->message()->header()->fieldBodyForName("CSeq"), String::stringWithUTF8String("CSeq"));\r
+\r
+ InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, NULL);\r
+ RELEASE(header);\r
+\r
+ result->setMessage(message);\r
+ result->autorelease();\r
+ RELEASE(message);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("no match");\r
+ }\r
+\r
+ if (result == NULL)\r
+ {\r
+ result = HTTPResponse::alloc()->init();\r
+ result->setVersion(request->version());\r
+ result->setStatus(HTTP_STATUS_NOT_FOUND);\r
+ result->setReason(HTTPDaemon::reasonForStatus(HTTP_STATUS_NOT_FOUND));\r
+ result->autorelease();\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+HTTPResponse *Controller::request(HTTPRequest *request, SOCKET sock, SOCKADDR_IN *client)\r
+{\r
+ DebugLog2("%s\n", __FUNCTION__);\r
+\r
+ // 初期化チェック\r
+ bool flag = false;\r
+ RaymLock(this);\r
+ flag = _initialized;\r
+ RaymUnlock(this);\r
+ if (!flag)\r
+ {\r
+ return NULL;\r
+ }\r
+\r
+ if (request->version()->isEqualToString("RTSP/1.0"))\r
+ {\r
+ return requestRTSP((RTSPRequest *)request, sock, client);\r
+ }\r
+\r
+ HTTPResponse *response = NULL;\r
+\r
+ if (request->method()->isEqualToString("GET") ||\r
+ request->method()->isEqualToString("HEAD"))\r
+ {\r
+ // URI\r
+ String *uri = request->URI();\r
+ DebugLog0("request(%d): %s\n", sock, uri->cString());\r
+\r
+ //\r
+ //\r
+ //\r
+ if (uri->isMatch("^(/|/index\\.(htm|html))$"))\r
+ {\r
+ response = responseForMain(request, client);\r
+ }\r
+\r
+ else if (uri->isMatch("^/status.html$"))\r
+ {\r
+ response = responseForStatus(request, client);\r
+ }\r
+\r
+ //\r
+ else if (uri->isMatch("^/info.xml$"))\r
+ {\r
+ }\r
+ else if (uri->isMatch("^/video.xml$"))\r
+ {\r
+ }\r
+\r
+ //\r
+ // tuner control\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{3}/"))\r
+ {\r
+ // String::substringWithRange() を実装するのを後回しにするので。。\r
+ std::string s = uri->cString();\r
+ int tuner = atoi(s.substr(1, 3).c_str());\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ response = requestTunerControl(request, client, tuner);\r
+ }\r
+ }\r
+\r
+ //\r
+ // reservation control\r
+ //\r
+ else if (uri->isMatch("^/reservation.html$"))\r
+ {\r
+ response = responseForReservation(request, client);\r
+ }\r
+ else if (uri->isMatch("^/regist.cgi"))\r
+ {\r
+ response = responseForRegistCGI(request, client);\r
+ }\r
+ else if (uri->isMatch("^/cancel.cgi"))\r
+ {\r
+ response = responseForCancelCGI(request, client);\r
+ }\r
+ else if (uri->isMatch("^/add_keywords.cgi"))\r
+ {\r
+ response = responseForAddKeywordsCGI(request, client);\r
+ }\r
+ else if (uri->isMatch("^/mod_keywords.cgi"))\r
+ {\r
+ response = responseForModKeywordsCGI(request, client);\r
+ }\r
+ else if (uri->isMatch("^/reservation.xml$"))\r
+ {\r
+ }\r
+ else if (uri->isMatch("^/[0-9]{6}/"))\r
+ {\r
+// DebugLog2("reservation: %s\n", uri.c_str());\r
+ }\r
+\r
+ //\r
+ // video control\r
+ //\r
+ else if (uri->isMatch("^/[0-9]{9}/"))\r
+ {\r
+// DebugLog2("video: %s\n", uri.c_str());\r
+ }\r
+\r
+ //\r
+ // program\r
+ //\r
+ else if (uri->isMatch("^/programs.*\\.html$"))\r
+ {\r
+ response = responseForPrograms(request, client);\r
+ }\r
+ else if (uri->isMatch("^/programs.xml$"))\r
+ {\r
+// collectEPG();\r
+// return responseWithDictionary(request, _programs);\r
+ }\r
+\r
+ //\r
+ //\r
+ else if (uri->isMatch("^/tv.html$"))\r
+ {\r
+// return responseForTV(request, client);\r
+ }\r
+\r
+ // IPTV対応\r
+ else if (uri->isMatch("^/iptv.m3u8$"))\r
+ {\r
+ return responseForPlaylist(request, client);\r
+ }\r
+ else if (uri->isMatch("^/xmltv.xml$"))\r
+ {\r
+ return responseForXmltv(request, client);\r
+ }\r
+\r
+ //\r
+ else if (uri->isMatch("^/iptd\\.log$"))\r
+ {\r
+ String *path = _system_path->stringByAppendingPathComponent("log");\r
+ if (path != NULL)\r
+ {\r
+ path = path->stringByAppendingPathComponent("iptd_core.log");\r
+ if (path != NULL)\r
+ {\r
+ response = _httpd->responseWithPath(path, request);\r
+ if (response != NULL)\r
+ {\r
+ if (response->message() != NULL)\r
+ {\r
+ if (response->message()->header() != NULL)\r
+ {\r
+ response->message()->header()->setFieldBodyWithName("text/plane; charset=UTF-8", "Content-Type");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else if (uri->isMatch("^/non_idle\\.xml$"))\r
+ {\r
+ RaymLock(this);\r
+ _idle_count = 0;\r
+ RaymUnlock(this);\r
+ Service::cancelShutdown();\r
+ return responseForSuccess(request);\r
+ }\r
+ else if (uri->isMatch("^/config\\.xml\\?shutdown_time=\\d+$"))\r
+ {\r
+ Range r = uri->rangeOfString("time=");\r
+ int val = uri->substringFromIndex(r.location + 5)->intValue();\r
+ if (val >= DEF_SHUTDOWN_TIME)\r
+ {\r
+ RaymLock(this);\r
+ _shutdown_time = val;\r
+ RaymUnlock(this);\r
+ return responseForSuccess(request);\r
+ }\r
+ else\r
+ {\r
+ return responseForFailed(request);\r
+ }\r
+ }\r
+ }\r
+ else if (request->method()->isEqualToString("POST"))\r
+ {\r
+ // URI\r
+ String *uri = request->URI();\r
+ DebugLog1("POST: %s\n", uri->cString());\r
+ InternetTextMessage *message = request->message();\r
+ if (message != NULL)\r
+ {\r
+ DebugLog3("message: ");\r
+ InternetTextMessageHeader *header = message->header();\r
+ if (header != NULL)\r
+ {\r
+ DebugLog3("header: ");\r
+ }\r
+ InternetTextMessageBody *body = message->body();\r
+ if (body != NULL)\r
+ {\r
+ DebugLog3("body: ");\r
+ }\r
+ }\r
+ }\r
+\r
+ return response;\r
+}\r
+\r
+HTTPRequest * Controller::readRequest(SOCKET sock)\r
+{\r
+ return RTSPRequest::requestWithSocket(sock);\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- プロパティ取得 -------\r
+#endif\r
+\r
+bool Controller::isTunerInitialized(int tuner)\r
+{\r
+ DebugLog2("Controller::isTunerInitialized()");\r
+\r
+ bool result = false;\r
+\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ result = tunerInfo->boolForKey(KEY_INITIALIZED);\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+bool Controller::isTunerEnabled(int tuner)\r
+{\r
+ DebugLog2("Controller::isTunerEnabled()");\r
+\r
+ bool result = false;\r
+\r
+ if ((0 <= tuner) && (tuner < _tunerCount))\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ result = tunerInfo->boolForKey(KEY_ENABLED);\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+bool Controller::isChannelEnabled(int tuner, int channel)\r
+{\r
+ DebugLog2("Controller::isChannelEnabled()");\r
+\r
+ bool result = false;\r
+\r
+ if ((0 <= tuner) && (tuner < _tunerCount) && (0 <= channel) && (channel <= Tuner::MAX_CHANNELS_ISDB_T))\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[tuner]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels != NULL)\r
+ {\r
+ char key[4];\r
+ sprintf_s(key, "%03d", channel);\r
+ Dictionary *chInfo = channels->dictionaryForKey(key);\r
+ if (chInfo != NULL)\r
+ {\r
+ result = chInfo->boolForKey(KEY_ENABLED);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+Array *Controller::stationInfos(Tuner::Type type)\r
+{\r
+ DebugLog2("Controller::stationInfosForISDB_T()");\r
+\r
+ Array *result = Array::arrayWithCapacity(0);\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ if (_tuners[i]->type() == type)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[i]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels != NULL)\r
+ {\r
+ for (uint ch = 0; ch <= (type == Tuner::ISDB_T ? Tuner::MAX_CHANNELS_ISDB_T : Tuner::MAX_CHANNELS_ISDB_S); ++ch)\r
+ {\r
+ char chkey[4];\r
+ sprintf_s(chkey, "%03d", ch);\r
+ Dictionary *channel = channels->dictionaryForKey(chkey);\r
+ if ((channel != NULL) && channel->boolForKey(KEY_ENABLED))\r
+ {\r
+ result->addObject(channel);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+String *Controller::stationName(Tuner::Type type, int channel)\r
+{\r
+ DebugLog2("Controller::stationName()");\r
+\r
+ String *result = NULL;\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ if (_tuners[i]->type() == type)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey(_tuners[i]->name());\r
+ if (tunerInfo != NULL)\r
+ {\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels != NULL)\r
+ {\r
+ char chkey[4];\r
+ sprintf_s(chkey, "%03d", channel);\r
+ Dictionary *channel = channels->dictionaryForKey(chkey);\r
+ if ((channel != NULL) && channel->boolForKey(KEY_ENABLED))\r
+ {\r
+ result = channel->stringForKey(KEY_NAME);\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ return result;\r
+}\r
+\r
+Array *Controller::programsForServices(Array *services)\r
+{\r
+ DebugLog2("Controller::programsForServices()");\r
+\r
+ Array *result = Array::arrayWithCapacity(0);\r
+\r
+ // lock\r
+ RaymLock(_epgs);\r
+\r
+ for (uint i = 0; i < services->count(); ++i)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(i);\r
+ Dictionary *services = _epgs->dictionaryForKey(KEY_SERVICES);\r
+ Array *epgs = services->arrayForKey(service->stringForKey(KEY_SERVICE_ID));\r
+ if (epgs != NULL)\r
+ {\r
+ result->addObjectsFromArray(epgs);\r
+ }\r
+ }\r
+\r
+ // sort\r
+ result = result->sortedArrayUsingFunction(compareFunction, this);\r
+\r
+ // unlock\r
+ RaymUnlock(_epgs);\r
+\r
+ return result;\r
+}\r
+\r
+String *Controller::stationNameForServiceID(String *service_id)\r
+{\r
+ DebugLog2("Controller::stationNameForServiceID()");\r
+\r
+ String *result = NULL;\r
+\r
+ if (service_id != NULL)\r
+ {\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ Dictionary *tunersInfo = _props->dictionaryForKey(KEY_TUNERS);\r
+ if (tunersInfo != NULL)\r
+ {\r
+ Array *tuners_key = tunersInfo->allKeys();\r
+\r
+ for (uint i = 0; (result == NULL) && (i < tuners_key->count()); ++i)\r
+ {\r
+ Dictionary *tunerInfo = tunersInfo->dictionaryForKey((String *)tuners_key->objectAtIndex(i));\r
+ if (tunerInfo != NULL)\r
+ {\r
+ Dictionary *channels = tunerInfo->dictionaryForKey(KEY_CHANNELS);\r
+ if (channels != NULL)\r
+ {\r
+ Array *chkey = channels->allKeys();\r
+ for (uint ch = 0; (result == NULL) && (ch < chkey->count()); ++ch)\r
+ {\r
+ Dictionary *channel = channels->dictionaryForKey((String *)chkey->objectAtIndex(ch));\r
+ if (channel != NULL)\r
+ {\r
+ Array *services = channel->arrayForKey(KEY_SERVICES);\r
+ if (services != NULL)\r
+ {\r
+ for (uint j = 0; j < services->count(); ++j)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(j);\r
+ String *sid = service->stringForKey(KEY_SERVICE_ID);\r
+ if (sid != NULL)\r
+ {\r
+ if (sid->isEqualToString(service_id))\r
+ {\r
+ result = service->stringForKey(KEY_NAME);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- タイマディスパッチャ -------\r
+#endif\r
+\r
+void Controller::timerExpired(Timer *timer, void *userInfo)\r
+{\r
+ DebugLog2("Controller::timerExpired()");\r
+\r
+ //\r
+\r
+ switch ((long long)userInfo)\r
+ {\r
+ case CMD_RESTART:\r
+ if (restart() > 0)\r
+ {\r
+ // 初期化成功\r
+ DebugLog2("tuner initialize success.");\r
+\r
+ _cancel_epg_collect_s = false;\r
+ _cancel_epg_collect_t = false;\r
+\r
+ // EPG収集用タイマ起動(ISDB-S)\r
+ _timer_epg_s = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_S, true);\r
+ if (_timer_epg_s != NULL)\r
+ {\r
+ _timer_epg_s->fire();\r
+ }\r
+\r
+ // EPG収集用タイマ起動(ISDB-T)\r
+ _timer_epg_t = Timer::alloc()->initWithTimeInterval(DEF_COLLECT_EPG_DELAY, this, (void *)CMD_COLLECT_EPG_ISDB_T, true);\r
+ if (_timer_epg_t != NULL)\r
+ {\r
+ _timer_epg_t->fire();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // 失敗\r
+ DebugLog0("tuner initialize failed.");\r
+ }\r
+ break;\r
+\r
+ case CMD_PERIODIC: // 周期処理\r
+ periodic();\r
+ break;\r
+\r
+ case CMD_PERIODIC_2: // 周期処理2\r
+ periodic_2();\r
+ break;\r
+\r
+ case CMD_COLLECT_EPG_ISDB_S: // EPG収集(ISDB-S)\r
+ // 番組情報収集(ISDB-S)\r
+ if (collectEPGs(Tuner::ISDB_S))\r
+ {\r
+ // 終了(繰り返し無し)\r
+ _timer_epg_s->setRepeats(false);\r
+ }\r
+ else\r
+ {\r
+ // リトライ\r
+ _timer_epg_s->setTimeInterval(DEF_COLLECT_EPG_RETRY);\r
+ }\r
+ break;\r
+\r
+ case CMD_COLLECT_EPG_ISDB_T: // 番組情報収集(ISDB-T)\r
+ if (collectEPGs(Tuner::ISDB_T))\r
+ {\r
+ // 終了(繰り返し無し)\r
+ _timer_epg_t->setRepeats(false);\r
+ }\r
+ else\r
+ {\r
+ // リトライ\r
+ _timer_epg_t->setTimeInterval(DEF_COLLECT_EPG_RETRY);\r
+ }\r
+ break;\r
+ }\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- 起動/停止関連 -------\r
+#endif\r
+\r
+bool Controller::isIdleState()\r
+{\r
+ DebugLog2("Controller::isIdleState() start.");\r
+\r
+ bool result = _initialized;\r
+\r
+ RaymLock(this);\r
+\r
+ if (_initialized)\r
+ {\r
+ time_t now = time(NULL);\r
+\r
+ for (int tuner = 0; tuner < _tunerCount; ++tuner)\r
+ {\r
+ Array *array = _reservations->arrayForKey(_tuners[tuner]->name());\r
+ if ((array == NULL) || (array->count() == 0))\r
+ {\r
+ // next tuner\r
+ continue;\r
+ }\r
+\r
+ //\r
+ Dictionary *epg = (Dictionary *)array->objectAtIndex(0);\r
+ time_t start;\r
+ time_t end;\r
+ getTimeWithEPG(epg, &start, &end);\r
+\r
+ if (start + OFFSET_OF_SUPPRESSION_TIME <= now)\r
+ {\r
+ // busy\r
+ result = false;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ DebugLog2("Controller::isIdleState() end.");\r
+\r
+ return result;\r
+}\r
+\r
+/*\r
+ * TrayApp::WndProc() からコールされる\r
+ *\r
+ * スレッドコンテキスト:メインスレッド\r
+ */\r
+void Controller::systemWillSuspend()\r
+{\r
+ DebugLog2("Controller::systemWillSuspend() start");\r
+\r
+ RaymLock(this);\r
+ _cancel_epg_collect_s = true;\r
+ _cancel_epg_collect_t = true;\r
+ RaymUnlock(this);\r
+\r
+ // タイマ停止\r
+ if ((_timer_restart != NULL) && _timer_restart->valid())\r
+ {\r
+ _timer_restart->invalidate();\r
+ }\r
+ if ((_timer_epg_s != NULL) && _timer_epg_s->valid())\r
+ {\r
+ _timer_epg_s->invalidate();\r
+ }\r
+ if ((_timer_epg_t != NULL) && _timer_epg_t->valid())\r
+ {\r
+ _timer_epg_t->invalidate();\r
+ }\r
+ if ((_timer_periodic != NULL) && _timer_periodic->valid())\r
+ {\r
+ _timer_periodic->invalidate();\r
+ }\r
+ if ((_timer_periodic_2 != NULL) && _timer_periodic_2->valid())\r
+ {\r
+ _timer_periodic_2->invalidate();\r
+ }\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // タイマ解放\r
+ RELEASE(_timer_restart);\r
+ RELEASE(_timer_epg_s);\r
+ RELEASE(_timer_epg_t);\r
+ RELEASE(_timer_periodic);\r
+ RELEASE(_timer_periodic_2);\r
+\r
+ // スケジュール更新\r
+ updateSchedule();\r
+\r
+ // 未初期化に設定\r
+ _initialized = false;\r
+\r
+ // チューナ解放\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ if (_tuners[i] != NULL)\r
+ {\r
+ delete _tuners[i];\r
+ _tuners[i] = NULL;\r
+ }\r
+ }\r
+\r
+ DebugLog0("system will suspend...");\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+#ifdef OBJC_MEMORY_CHECK\r
+ DebugLog0("global_objc_count_ = %d", Raym::global_objc_count_);\r
+#endif\r
+\r
+ DebugLog2("Controller::systemWillSuspend() end");\r
+}\r
+\r
+/*\r
+ * TrayApp::WndProc() からコールされる\r
+ *\r
+ * スレッドコンテキスト:メインスレッド\r
+ */\r
+void Controller::systemResumed()\r
+{\r
+ DebugLog2("Controller::systemResumed() start");\r
+\r
+ DebugLog0("system resumed.");\r
+\r
+ if (_timer_restart == NULL)\r
+ {\r
+ // 再開タイマ起動\r
+ _timer_restart = Timer::alloc()->initWithTimeInterval(1.0, this, (void *)CMD_RESTART, false);\r
+ _timer_restart->fire();\r
+ }\r
+\r
+ DebugLog2("Controller::systemResumed()");\r
+}\r
+\r
+void Controller::detectNonIdle()\r
+{\r
+ DebugLog2("Controller::detectNonIdle()");\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ if (_idle_count > 0)\r
+ {\r
+ DebugLog0("detect non idle...");\r
+ }\r
+ _idle_count = 0;\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+}\r
+\r
+int Controller::restart()\r
+{\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // 未初期化に設定\r
+ _initialized = false;\r
+\r
+ // チューナ解放\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ if (_tuners[i] != NULL)\r
+ {\r
+ delete _tuners[i];\r
+ _tuners[i] = NULL;\r
+ }\r
+ }\r
+\r
+ // 古い予約情報の破棄\r
+\r
+\r
+ // チューナ初期化\r
+ _tunerCount = ry0::device::TunerFactory::scan(_tuners, _multi2_dll);\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ // チューナでループ\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ // チューナが初期化済みか\r
+ if (!isTunerInitialized(i))\r
+ {\r
+ // チャンネルスキャン\r
+ scanChannel(i);\r
+ }\r
+\r
+ if (isTunerEnabled(i))\r
+ {\r
+ // チャンネル設定\r
+ setChannel(i, getChannel(i));\r
+ }\r
+ }\r
+\r
+ Dictionary *tunerInfos = _props->dictionaryForKey(KEY_TUNERS);\r
+\r
+ // EPG未収集の場合\r
+ // 最大チューナ番号の各サービスにIPTV有効フラグを立てる\r
+ if (_epgs->count() == 0)\r
+ {\r
+ Dictionary *flags = Dictionary::dictionaryWithCapacity(0);\r
+ for (int idx = _tunerCount - 1; idx >= 0; --idx)\r
+ {\r
+ Dictionary *tunerInfo = tunerInfos->dictionaryForKey(_tuners[idx]->name());\r
+ if (tunerInfo->boolForKey(KEY_ENABLED))\r
+ {\r
+ int ch_max = (_tuners[idx]->type() == Tuner::Type::ISDB_T) ? Tuner::MAX_CHANNELS_ISDB_T : Tuner::MAX_CHANNELS_ISDB_S;\r
+ for (int ch = 0; ch < ch_max; ++ch)\r
+ {\r
+ char key[8];\r
+ sprintf_s(key, "%03d", ch);\r
+ Dictionary *channelInfo = tunerInfo->dictionaryForKey(KEY_CHANNELS)->dictionaryForKey(key);\r
+ if ((channelInfo != NULL) && channelInfo->boolForKey(KEY_ENABLED))\r
+ {\r
+ Array *services = channelInfo->arrayForKey(KEY_SERVICES);\r
+ for (uint service_idx = 0; service_idx < services->count(); ++service_idx)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(service_idx);\r
+ if (!flags->boolForKey(service->stringForKey(KEY_SERVICE_ID)))\r
+ {\r
+ service->setBool(true, KEY_IPTV_ENABLED);\r
+ flags->setBool(true, service->stringForKey(KEY_SERVICE_ID));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ _props->writeToFile(_props_path, true);\r
+ }\r
+\r
+ // IPTV用データの準備/UDPポートマッピング\r
+ Dictionary *temp_data = Dictionary::dictionaryWithCapacity(0);\r
+ _epgs->setObject(temp_data, KEY_TEMP_DATA);\r
+\r
+ _xmltv_channels = "";\r
+ std::string str_iptv_m3u8_local;\r
+ std::string str_iptv_m3u8_remote;\r
+\r
+ str_iptv_m3u8_local = "#EXTM3U\r\n";\r
+ str_iptv_m3u8_local += "\r\n";\r
+ str_iptv_m3u8_remote = "#EXTM3U\r\n";\r
+ str_iptv_m3u8_remote += "\r\n";\r
+\r
+ int udpport = _props->integerForKey(KEY_BEGIN_UDP_PORT);\r
+ char http_port_str[10];\r
+ sprintf_s(http_port_str, "%d", _props->integerForKey(KEY_HTTP_PORT));\r
+ int idx_isdb_t = 0;\r
+ int idx_isdb_s = 0;\r
+ Tuner::Type type = Tuner::Type::ISDB_T;\r
+ while ((idx_isdb_t < _tunerCount) || (idx_isdb_s < _tunerCount))\r
+ {\r
+ int *idx = (type == Tuner::Type::ISDB_T) ? &idx_isdb_t : &idx_isdb_s;\r
+ while (*idx < _tunerCount)\r
+ {\r
+ if (_tuners[*idx]->type() == type)\r
+ {\r
+ Dictionary *tunerInfo = tunerInfos->dictionaryForKey(_tuners[*idx]->name());\r
+ if (tunerInfo->boolForKey(KEY_ENABLED))\r
+ {\r
+ int ch_max = (type == Tuner::Type::ISDB_T) ? Tuner::MAX_CHANNELS_ISDB_T : Tuner::MAX_CHANNELS_ISDB_S;\r
+ for (int ch = 0; ch < ch_max; ++ch)\r
+ {\r
+ char key[8];\r
+ sprintf_s(key, "%03d", ch);\r
+ Dictionary *channelInfo = tunerInfo->dictionaryForKey(KEY_CHANNELS)->dictionaryForKey(key);\r
+ if ((channelInfo != NULL) && channelInfo->boolForKey(KEY_ENABLED))\r
+ {\r
+ Array *services = channelInfo->arrayForKey(KEY_SERVICES);\r
+ for (uint service_idx = 0; service_idx < services->count(); ++service_idx)\r
+ {\r
+ Dictionary *service = (Dictionary *)services->objectAtIndex(service_idx);\r
+ if (service->boolForKey(KEY_IPTV_ENABLED))\r
+ {\r
+ char channel_name[32];\r
+ sprintf_s(channel_name, "%03d_%s", *idx, service->stringForKey(KEY_SERVICE_ID)->cString());\r
+ char channel_service_id[32];\r
+ sprintf_s(channel_service_id, "%03d/%s", *idx, service->stringForKey(KEY_SERVICE_ID)->cString());\r
+\r
+ Dictionary *temp_service = temp_data->dictionaryForKey(service->stringForKey(KEY_SERVICE_ID));\r
+ if (temp_service == NULL)\r
+ {\r
+ temp_service = Dictionary::dictionaryWithCapacity(0);\r
+ temp_data->setObject(temp_service, service->stringForKey(KEY_SERVICE_ID));\r
+ }\r
+ Array *ch_list = temp_service->arrayForKey(KEY_CHANNELS);\r
+ if (ch_list == NULL)\r
+ {\r
+ ch_list = Array::arrayWithCapacity(0);\r
+ temp_service->setObject(ch_list, KEY_CHANNELS);\r
+ }\r
+ ch_list->addObject(String::stringWithUTF8String(channel_name));\r
+\r
+ Dictionary *udp_to_tuner_service_id = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_UDP_TO_TUNER_SERVICE_ID);\r
+ if (udp_to_tuner_service_id == NULL)\r
+ {\r
+ udp_to_tuner_service_id = Dictionary::dictionaryWithCapacity(0);\r
+ _streaming_ctrls->setObject(udp_to_tuner_service_id, KEY_MAPPING_UDP_TO_TUNER_SERVICE_ID);\r
+ }\r
+\r
+ Dictionary *tuner_service_id_to_udp = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_TUNER_SERVICE_ID_TO_UDP);\r
+ if (tuner_service_id_to_udp == NULL)\r
+ {\r
+ tuner_service_id_to_udp = Dictionary::dictionaryWithCapacity(0);\r
+ _streaming_ctrls->setObject(tuner_service_id_to_udp, KEY_MAPPING_TUNER_SERVICE_ID_TO_UDP);\r
+ }\r
+\r
+ Dictionary *tuner_service_id_to_channel = _streaming_ctrls->dictionaryForKey(KEY_MAPPING_TUNER_SERVICE_ID_TO_CHANNEL);\r
+ if (tuner_service_id_to_channel == NULL)\r
+ {\r
+ tuner_service_id_to_channel = Dictionary::dictionaryWithCapacity(0);\r
+ _streaming_ctrls->setObject(tuner_service_id_to_channel, KEY_MAPPING_TUNER_SERVICE_ID_TO_CHANNEL);\r
+ }\r
+\r
+ char port_str[10];\r
+ sprintf_s(port_str, "%d", udpport++);\r
+\r
+ udp_to_tuner_service_id->setString(channel_name, port_str);\r
+ tuner_service_id_to_udp->setString(port_str, channel_name);\r
+ tuner_service_id_to_channel->setInteger(ch, channel_name);\r
+\r
+\r
+ _xmltv_channels += " <channel id=\"";\r
+ _xmltv_channels += channel_name;\r
+ _xmltv_channels += "\"";\r
+ // transport_stream_id\r
+ // original_network_id\r
+ _xmltv_channels += " service_id=\"";\r
+ _xmltv_channels += service->stringForKey(KEY_SERVICE_ID)->cString();\r
+ _xmltv_channels += "\">\r\n";\r
+\r
+ _xmltv_channels += " <display-name lang=\"ja_JP\">";\r
+ _xmltv_channels += service->stringForKey(KEY_NAME)->cString();\r
+ _xmltv_channels += "</display-name>\r\n";\r
+\r
+ _xmltv_channels += " </channel>\r\n";\r
+\r
+ str_iptv_m3u8_local += "#EXTINF:-1 tvg-id=\"";\r
+ str_iptv_m3u8_local += channel_name;\r
+ str_iptv_m3u8_local += "\" tvg-logo=\"logo_";\r
+ str_iptv_m3u8_local += channel_name;\r
+ str_iptv_m3u8_local += "\" group-title=\"";\r
+ str_iptv_m3u8_local += _tuners[*idx]->name();\r
+ str_iptv_m3u8_local += "\", ";\r
+ str_iptv_m3u8_local += service->stringForKey(KEY_NAME)->cString();\r
+ str_iptv_m3u8_local += "\r\n";\r
+ str_iptv_m3u8_local += "udp://0.0.0.0:";\r
+ str_iptv_m3u8_local += port_str;\r
+ str_iptv_m3u8_local += "\r\n";\r
+\r
+ str_iptv_m3u8_remote += "#EXTINF:-1 tvg-id=\"";\r
+ str_iptv_m3u8_remote += channel_name;\r
+ str_iptv_m3u8_remote += "\" tvg-logo=\"logo_";\r
+ str_iptv_m3u8_remote += channel_name;\r
+ str_iptv_m3u8_remote += "\" group-title=\"";\r
+ str_iptv_m3u8_remote += _tuners[*idx]->name();\r
+ str_iptv_m3u8_remote += "\", ";\r
+ str_iptv_m3u8_remote += service->stringForKey(KEY_NAME)->cString();\r
+ str_iptv_m3u8_remote += "\r\n";\r
+#if 1\r
+ if (_props->stringForKey(KEY_HTTP_HOST) != NULL)\r
+ {\r
+ str_iptv_m3u8_remote += "http://";\r
+ str_iptv_m3u8_remote += _props->stringForKey(KEY_HTTP_HOST)->cString();\r
+ str_iptv_m3u8_remote += ":";\r
+ str_iptv_m3u8_remote += http_port_str;\r
+ str_iptv_m3u8_remote += "/";\r
+ str_iptv_m3u8_remote += channel_service_id;\r
+ str_iptv_m3u8_remote += "/streaming.m3u8\r\n";\r
+ }\r
+#else\r
+// str_iptv_m3u8_remote += "rtsp://";\r
+ str_iptv_m3u8_remote += "sip://";\r
+ str_iptv_m3u8_remote += _props->stringForKey(KEY_HTTP_HOST)->cString();\r
+ str_iptv_m3u8_remote += ":";\r
+ str_iptv_m3u8_remote += http_port_str;\r
+ str_iptv_m3u8_remote += "/";\r
+ str_iptv_m3u8_remote += channel_service_id;\r
+ str_iptv_m3u8_remote += "/streaming.sdp\r\n";\r
+#endif\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ ++(*idx);\r
+ }\r
+ ++(*idx);\r
+ type = (type == Tuner::Type::ISDB_T) ? Tuner::Type::ISDB_S : Tuner::Type::ISDB_T;\r
+ }\r
+\r
+ RELEASE(_iptv_m3u8_local);\r
+ _iptv_m3u8_local = String::alloc()->initWithUTF8String(str_iptv_m3u8_local.c_str());\r
+ RELEASE(_iptv_m3u8_remote);\r
+ _iptv_m3u8_remote = String::alloc()->initWithUTF8String(str_iptv_m3u8_remote.c_str());\r
+\r
+ // 過去の番組データは削除\r
+ removePastEPGs();\r
+\r
+ // 周期タイマ起動\r
+ _timer_periodic = Timer::alloc()->initWithTimeInterval(1.0, this, (void *)CMD_PERIODIC, true);\r
+ _timer_periodic->fire();\r
+\r
+ // 周期タイマ2起動\r
+ _timer_periodic_2 = Timer::alloc()->initWithTimeInterval(1.0, this, (void *)CMD_PERIODIC_2, true);\r
+ _timer_periodic_2->fire();\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ // 初期化済みに設定\r
+ _initialized = true;\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ DebugLog0("initialize done.");\r
+\r
+ return (_tunerCount > 0);\r
+}\r
+\r
+void Controller::start()\r
+{\r
+ // ログファイル数設定\r
+ // 設定以前にログ出力しないこと\r
+ Raym::LOG_NUM_MAX = 8;\r
+\r
+#if 1\r
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());\r
+ if (hProcess != NULL)\r
+ {\r
+ if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS) == FALSE)\r
+ {\r
+ DebugLog0("SetPriorityClass failed.");\r
+ }\r
+ CloseHandle(hProcess);\r
+ }\r
+#endif\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("");\r
+ DebugLog0("global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ //\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ // メンバ初期化\r
+ _state = ST_IDLE;\r
+ _system_path = NULL;\r
+ _props_path = NULL;\r
+ _props = NULL;\r
+ _status_path = NULL;\r
+ _status = NULL;\r
+ _epgs_path = NULL;\r
+ _epgs = NULL;\r
+ _store_path = NULL;\r
+ _store_remain = -1;\r
+ _reservations = NULL;\r
+ _reservations_path = NULL;\r
+ _timer_restart = NULL;\r
+ _timer_periodic = NULL;\r
+ _timer_periodic_2 = NULL;\r
+ _timer_epg_s = NULL;\r
+ _timer_epg_t = NULL;\r
+ _multi2_dll = NULL;\r
+ _streaming_ctrls = NULL;\r
+\r
+ _idle_count = 0;\r
+ _shutdown_time = 0;\r
+ _initialized = false;\r
+ _reservation_seq_id = 0;\r
+ _cancel_epg_collect_s = false;\r
+ _cancel_epg_collect_t = false;\r
+\r
+ _iptv_m3u8_local = NULL;\r
+ _iptv_m3u8_remote = NULL; \r
+\r
+ _tunerCount = 0;\r
+ for (int i = 0; i < ry0::device::MAX_TUNERS; ++i)\r
+ {\r
+ _tuners[i] = NULL;\r
+ }\r
+\r
+ DebugLog0("");\r
+ DebugLog0("------------------------------------------------------------------------");\r
+ DebugLog0("iPTd ver %s (rev.%d)", VERSION, REVISION);\r
+ DebugLog0("initialize...");\r
+\r
+ // 初期化\r
+ while (true)\r
+ {\r
+ bool updated = false;\r
+\r
+ // システムパス設定\r
+ _system_path = String::stringWithFormat("%s", GetExecutePath());\r
+ if (_system_path == NULL)\r
+ {\r
+ DebugLog0("error: GetExecutePath()");\r
+ break;\r
+ }\r
+ _system_path = _system_path->stringByReplacingOccurrencesOfString("iptd_core.exe", "");\r
+ _system_path->retain();\r
+ DebugLog2("_system_path: %s", _system_path->cString());\r
+\r
+ // プロパティファイルのパス設定\r
+ _props_path = String::alloc()->initWithFormat("%s%s.iptd.plist", _system_path->cString(), PLIST_PREFIX);\r
+ if (_props_path == NULL)\r
+ {\r
+ DebugLog0("error: set property file path.");\r
+ break;\r
+ }\r
+\r
+ // プロパティの読み込み\r
+ _props = Dictionary::alloc()->initWithContentsOfFile(_props_path);\r
+ if (_props == NULL)\r
+ {\r
+ DebugLog1("property file: %s (created)", _props_path->cString());\r
+ _props = Dictionary::alloc()->initWithCapacity(0);\r
+ }\r
+ else\r
+ {\r
+ DebugLog1("property file: %s", _props_path->cString());\r
+ }\r
+\r
+ // ステータスファイルのパス設定\r
+ _status_path = String::alloc()->initWithFormat("%s%s.iptd.status.plist", _system_path->cString(), PLIST_PREFIX);\r
+ if (_status_path == NULL)\r
+ {\r
+ DebugLog0("error: set status file path.");\r
+ break;\r
+ }\r
+\r
+ // ステータスの読み込み\r
+ _status = Dictionary::alloc()->initWithContentsOfFile(_status_path);\r
+ if (_status == NULL)\r
+ {\r
+ DebugLog1("status file: %s (created)", _status_path->cString());\r
+ _status = Dictionary::alloc()->initWithCapacity(0);\r
+ }\r
+ else\r
+ {\r
+ DebugLog1("status file: %s", _status_path->cString());\r
+ }\r
+\r
+ // システム名\r
+ if (_props->stringForKey(KEY_NAME) == NULL)\r
+ {\r
+ _props->setString(DEF_NAME, KEY_NAME);\r
+ updated = true;\r
+ }\r
+\r
+ // ホスト名\r
+ if (_props->stringForKey(KEY_HOSTNAME) == NULL)\r
+ {\r
+ _props->setString(DEF_HOSTNAME, KEY_HOSTNAME);\r
+ updated = true;\r
+ }\r
+\r
+ // multi2デコード可否判定: multi2.dll が使えるか確認する\r
+ _multi2_dll = ::LoadLibrary(L"multi2.dll");\r
+ while (_multi2_dll != NULL)\r
+ {\r
+ // b25: 関数アドレス取得\r
+ ARIB_STD_B25 *(*func_b25)();\r
+ func_b25 = reinterpret_cast<ARIB_STD_B25 *(*)()>(::GetProcAddress(_multi2_dll, "create_arib_std_b25"));\r
+ if (func_b25 == NULL)\r
+ {\r
+ // 関数アドレス取得NG\r
+ FreeLibrary(_multi2_dll);\r
+ _multi2_dll = NULL;\r
+ break;\r
+ }\r
+\r
+ // b25: インスタンス生成\r
+ ARIB_STD_B25 * _b25;\r
+ _b25 = func_b25();\r
+ if (_b25 == NULL)\r
+ {\r
+ // インスタンス生成NG\r
+ FreeLibrary(_multi2_dll);\r
+ _multi2_dll = NULL;\r
+ break;\r
+ }\r
+ _b25->release(_b25);\r
+\r
+ // bcas: 関数アドレス取得\r
+ B_CAS_CARD *(*func_bcas)();\r
+ func_bcas = reinterpret_cast<B_CAS_CARD *(*)()>(::GetProcAddress(_multi2_dll, "create_b_cas_card"));\r
+ if (func_bcas == NULL)\r
+ {\r
+ // 関数アドレス取得NG\r
+ FreeLibrary(_multi2_dll);\r
+ _multi2_dll = NULL;\r
+ break;\r
+ }\r
+\r
+ // bcas: インスタンス生成\r
+ B_CAS_CARD * _bcas;\r
+ _bcas = func_bcas();\r
+ if (_bcas == NULL)\r
+ {\r
+ // インスタンス生成NG\r
+ FreeLibrary(_multi2_dll);\r
+ _multi2_dll = NULL;\r
+ break;\r
+ }\r
+ if (_bcas->init(_bcas) != 0)\r
+ {\r
+ // bcas初期化NG\r
+ FreeLibrary(_multi2_dll);\r
+ _multi2_dll = NULL;\r
+ break;\r
+ }\r
+ _bcas->release(_bcas);\r
+\r
+ // デコード可\r
+ break;\r
+ }\r
+\r
+ // HTTP ポート\r
+ if (_props->integerForKey(KEY_HTTP_PORT) == 0)\r
+ {\r
+ _props->setInteger(DEF_HTTP_PORT, KEY_HTTP_PORT);\r
+ updated = true;\r
+ }\r
+\r
+ if (_props->stringForKey(KEY_HTTP_HOST) == NULL)\r
+ {\r
+ char hostname[NI_MAXHOST];\r
+ if (gethostname(hostname, sizeof(hostname)) == 0)\r
+ {\r
+ addrinfo ai;\r
+ ai.ai_family = PF_INET;\r
+ ai.ai_flags = AI_CANONNAME;\r
+ addrinfo *p = NULL;\r
+ if (getaddrinfo(hostname, 0, &ai, &p) == 0)\r
+ {\r
+ char hostaddr[40];\r
+ if (getnameinfo(p->ai_addr, (int)p->ai_addrlen, hostaddr, sizeof(hostaddr), 0, 0, NI_NUMERICHOST) == 0)\r
+ {\r
+ _props->setString(hostaddr, KEY_HTTP_HOST);\r
+ updated = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // UDPポートの開始番号\r
+ if (_props->integerForKey(KEY_BEGIN_UDP_PORT) == 0)\r
+ {\r
+ _props->setInteger(DEF_BEGIN_UDP_PORT, KEY_BEGIN_UDP_PORT);\r
+ updated = true;\r
+ }\r
+\r
+ // EPGを収集する時間\r
+ if ((_props->stringForKey(KEY_COLLECT_EPG_TIME) == NULL) ||\r
+ !_props->stringForKey(KEY_COLLECT_EPG_TIME)->isMatch(String::stringWithUTF8String("^\\d\\d:\\d\\d:\\d\\d$")))\r
+ {\r
+ _props->setString(DEF_COLLECT_EPG_TIME, KEY_COLLECT_EPG_TIME);\r
+ updated = true;\r
+ }\r
+\r
+ // 録画データ格納先の確認\r
+ _store_path = _props->stringForKey(KEY_STORE_PATH);\r
+ if (_store_path == NULL)\r
+ {\r
+ // プロパティに未設定の場合\r
+ // <Public Directory>/Videos を設定\r
+ const char *public_dir = GetPublicDirectory();\r
+ if (public_dir == NULL)\r
+ {\r
+ DebugLog0("error: GetPublicDirectory().");\r
+ break;\r
+ }\r
+ _store_path = String::alloc()->initWithFormat("%s\\Videos", public_dir);\r
+ _props->setString(_store_path, KEY_STORE_PATH);\r
+\r
+ // 更新フラグ\r
+ updated = true;\r
+ }\r
+ else\r
+ {\r
+ _store_path->retain();\r
+ }\r
+\r
+ // 実際にディレクトリが存在しているか確認\r
+ FileManager *fm = FileManager::defaultManager();\r
+ bool isDir = false;\r
+ if (!fm->fileExistsAtPath(_store_path, &isDir))\r
+ {\r
+ isDir = false;\r
+ }\r
+ if (!isDir)\r
+ {\r
+ DebugLog0("error: \"%s\" is not exists.", _store_path->cString());\r
+ break;\r
+ }\r
+\r
+ _store_remain = FileManager::freeSpaceForPath(_store_path);\r
+\r
+ // HLS Preset\r
+ if (_props->dictionaryForKey(KEY_PRESETS) == NULL)\r
+ {\r
+ Dictionary *presets = Dictionary::dictionaryWithCapacity(0);\r
+ _props->setObject(presets, KEY_PRESETS);\r
+\r
+// とりあえずこのまま\r
+// プリセットは、あとで実装。。。 \r
+ Array *preset;\r
+\r
+ // "default"\r
+ preset = STR_ARRAY("-vcodec", "libx264",\r
+ "-b:v", "768k",\r
+ "-s", "640x360",\r
+ "-acodec", "libfaac",\r
+ "-b:a", "96k",\r
+ "-ar", "44100",\r
+ "-flags", "+loop-global_header",\r
+ "-map", "0",\r
+ "-bsf", "h264_mp4toannexb",\r
+ "-f", "segment",\r
+ "-segment_format", "mpegts",\r
+ "-segment_time", "10",\r
+ NULL);\r
+ presets->setObject(preset, KEY_DEFAULT);\r
+\r
+ updated = true;\r
+ }\r
+\r
+ // キャッシュ(HLSの一時ファイル格納先)パス\r
+ if (_props->stringForKey(KEY_CACHE_PATH) == NULL)\r
+ {\r
+ _props->setString(_store_path->stringByAppendingPathComponent("Cache"), KEY_CACHE_PATH);\r
+ _mkdir(_props->stringForKey(KEY_CACHE_PATH)->cString());\r
+ updated = true;\r
+ }\r
+ isDir = false;\r
+ if (!fm->fileExistsAtPath(_props->stringForKey(KEY_CACHE_PATH), &isDir))\r
+ {\r
+ isDir = false;\r
+ }\r
+ if (!isDir)\r
+ {\r
+ DebugLog0("error: \"%s\" is not exists.", _props->stringForKey(KEY_CACHE_PATH)->cString());\r
+ break;\r
+ }\r
+\r
+ // 強制シャットダウンまでの時間\r
+ if ((_props->integerForKey(KEY_FORCED_SHUTDOWN) == 0) || (_props->integerForKey(KEY_FORCED_SHUTDOWN) < DEF_FORCED_SHUTDOWN))\r
+ {\r
+ _props->setInteger(DEF_FORCED_SHUTDOWN, KEY_FORCED_SHUTDOWN);\r
+ updated = true;\r
+ }\r
+\r
+ // シャットダウン抑止アプリリスト\r
+ if (_props->arrayForKey(KEY_DO_NOT_IN_SHUTDOWN) == NULL)\r
+ {\r
+ Array *apps = Array::arrayWithCapacity(0);\r
+ apps->addObject(String::stringWithUTF8String("PIXELACORPORATION.*DtvView\\.exe$"));\r
+ apps->addObject(String::stringWithUTF8String("Common7\\\\IDE\\\\devenv\\.exe$"));\r
+ apps->addObject(String::stringWithUTF8String("Kodi\\\\Kodi\\.exe$"));\r
+ _props->setObject(apps, KEY_DO_NOT_IN_SHUTDOWN);\r
+ updated = true;\r
+ }\r
+\r
+ // プロパティファイルを保存\r
+ if (updated)\r
+ {\r
+ DebugLog0("props updated.");\r
+ if (!_props->writeToFile(_props_path, true))\r
+ {\r
+ DebugLog0("Can't write property file.");\r
+ break;\r
+ }\r
+ }\r
+\r
+ // プロパティの確認\r
+ DebugLog0(" Name : %s", _props->stringForKey(KEY_NAME)->cString());\r
+ DebugLog0(" Decode Enabled : %s", (_multi2_dll != NULL) ? "true" : "false");\r
+ DebugLog0(" HTTP Port : %d", _props->integerForKey(KEY_HTTP_PORT));\r
+ if (_props->stringForKey(KEY_POWER_MANAGER) != NULL)\r
+ {\r
+ DebugLog0(" Power Manager : %s", _props->stringForKey(KEY_POWER_MANAGER)->cString());\r
+ }\r
+\r
+ // 番組データファイルのパス設定\r
+ _epgs_path = String::alloc()->initWithFormat("%s%s.iptd.epgs.plist", _system_path->cString(), PLIST_PREFIX);\r
+ if (_epgs_path == NULL)\r
+ {\r
+ DebugLog0("error: set epgs file path.");\r
+ break;\r
+ }\r
+\r
+ // 番組データの読み込み\r
+ _epgs = Dictionary::alloc()->initWithContentsOfFile(_epgs_path);\r
+ if (_epgs == NULL)\r
+ {\r
+ DebugLog1("epgs file: %s (created)", _epgs_path->cString());\r
+ _epgs = Dictionary::alloc()->initWithCapacity(0);\r
+ }\r
+ else\r
+ {\r
+ DebugLog1("epgs file: %s", _epgs_path->cString());\r
+ }\r
+\r
+ // 予約データファイルのパス設定\r
+ _reservations_path = String::alloc()->initWithFormat("%s%s.iptd.reservations.plist", _system_path->cString(), PLIST_PREFIX);\r
+ if (_reservations_path == NULL)\r
+ {\r
+ DebugLog0("error: set reservations file path.");\r
+ break;\r
+ }\r
+\r
+ // 予約データの読み込み\r
+ _reservations = Dictionary::alloc()->initWithContentsOfFile(_reservations_path);\r
+ if (_reservations == NULL)\r
+ {\r
+ DebugLog1("reservations file: %s (created)", _reservations_path->cString());\r
+ _reservations = Dictionary::alloc()->initWithCapacity(0);\r
+ }\r
+ else\r
+ {\r
+ DebugLog1("reservations file: %s", _reservations_path->cString());\r
+\r
+ // 予約情報シーケンスID\r
+ _reservation_seq_id = _reservations->integerForKey(KEY_EPG_LAST_RESV_ID);\r
+ }\r
+\r
+ // ストリーミング制御情報格納用\r
+ _streaming_ctrls = Dictionary::alloc()->initWithCapacity(0);\r
+\r
+ // httpdのルートパス\r
+ String *rootPath = _system_path->stringByAppendingPathComponent("iptd_html");\r
+ if (!fm->fileExistsAtPath(rootPath, &isDir))\r
+ {\r
+ isDir = false;\r
+ }\r
+ if (!isDir)\r
+ {\r
+ DebugLog0("error: \"%s\" is not exists.", rootPath->cString());\r
+ break;\r
+ }\r
+\r
+ // httpd開始\r
+ int port = _props->integerForKey(KEY_HTTP_PORT);\r
+ _httpd = NET::HTTPDaemon::alloc()->initWithPort(port, 30);\r
+ _httpd->setRootPath(rootPath);\r
+ _httpd->setDelegate(this);\r
+ if (!_httpd->start())\r
+ {\r
+ DebugLog0("Can't start httpd.");\r
+ break;\r
+ }\r
+\r
+ // 再開タイマ起動\r
+ _timer_restart = Timer::alloc()->initWithTimeInterval(1.0, this, (void *)CMD_RESTART, false);\r
+ _timer_restart->fire();\r
+\r
+\r
+ SERVICE_STATUS ss;\r
+ ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;\r
+ ss.dwWin32ExitCode = NO_ERROR;\r
+ ss.dwServiceSpecificExitCode = 0;\r
+ ss.dwCheckPoint = 0;\r
+ ss.dwWaitHint = 0;\r
+ ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;\r
+ ss.dwCurrentState = SERVICE_RUNNING;\r
+\r
+ if (setServiceStatus(&ss))\r
+ {\r
+ RaymLock(this);\r
+ _state = ST_RUN;\r
+ while (_state == ST_RUN)\r
+ {\r
+ RaymCondWait(this);\r
+ }\r
+ RaymUnlock(this);\r
+\r
+ RaymLock(this);\r
+ _cancel_epg_collect_s = true;\r
+ _cancel_epg_collect_t = true;\r
+ RaymUnlock(this);\r
+\r
+ // httpd終了待ち\r
+ _httpd->stop();\r
+\r
+ // スケジュール更新\r
+ updateSchedule();\r
+ }\r
+ else\r
+ {\r
+ DebugLog0("error: SetServiceStatus(): %u", GetLastError());\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ // タイマ停止\r
+ if ((_timer_restart != NULL) && _timer_restart->valid())\r
+ {\r
+ _timer_restart->invalidate();\r
+ }\r
+ if ((_timer_epg_s != NULL) && _timer_epg_s->valid())\r
+ {\r
+ _timer_epg_s->invalidate();\r
+ }\r
+ if ((_timer_epg_t != NULL) && _timer_epg_t->valid())\r
+ {\r
+ _timer_epg_t->invalidate();\r
+ }\r
+ if ((_timer_periodic != NULL) && _timer_periodic->valid())\r
+ {\r
+ _timer_periodic->invalidate();\r
+ }\r
+ if ((_timer_periodic_2 != NULL) && _timer_periodic_2->valid())\r
+ {\r
+ _timer_periodic_2->invalidate();\r
+ }\r
+\r
+ // チューナ解放\r
+ for (int i = 0; i < _tunerCount; ++i)\r
+ {\r
+ if (_tuners[i] != NULL)\r
+ {\r
+ delete _tuners[i];\r
+ _tuners[i] = NULL;\r
+ }\r
+ }\r
+\r
+ // 解放\r
+ RELEASE(_timer_restart);\r
+ RELEASE(_timer_epg_s);\r
+ RELEASE(_timer_epg_t);\r
+ RELEASE(_timer_periodic);\r
+ RELEASE(_timer_periodic_2);\r
+ RELEASE(_streaming_ctrls);\r
+ RELEASE(_httpd);\r
+ RELEASE(_system_path);\r
+ RELEASE(_props_path);\r
+ RELEASE(_props);\r
+ RELEASE(_status_path);\r
+ RELEASE(_status);\r
+ RELEASE(_epgs_path);\r
+ RELEASE(_epgs);\r
+ RELEASE(_store_path);\r
+ RELEASE(_reservations_path);\r
+ RELEASE(_reservations);\r
+ RELEASE(_iptv_m3u8_local);\r
+ RELEASE(_iptv_m3u8_remote);\r
+\r
+ if (_multi2_dll != NULL)\r
+ {\r
+ FreeLibrary(_multi2_dll);\r
+ }\r
+\r
+ RaymLock(this);\r
+ _state = ST_IDLE;\r
+ RaymCondSignal(this);\r
+ RaymUnlock(this);\r
+\r
+ pool->release();\r
+\r
+ // 終了\r
+ DebugLog0("finished.");\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+}\r
+\r
+void Controller::stop()\r
+{\r
+ RaymLock(this);\r
+ if (_state == ST_RUN)\r
+ {\r
+ _state = ST_DONE;\r
+ RaymCondSignal(this);\r
+ while (_state != ST_IDLE)\r
+ {\r
+ RaymCondWait(this);\r
+ }\r
+ }\r
+ RaymUnlock(this);\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- コンストラクタ/デストラクタ -------\r
+#endif\r
+\r
+Controller::Controller()\r
+{\r
+}\r
+\r
+Controller::~Controller()\r
+{\r
+}\r
+\r
+Controller *Controller::alloc()\r
+{\r
+ return new Controller();\r
+}\r
+\r
+#ifndef _WIN32\r
+#pragma mark '\r
+#pragma mark ------- その他 -------\r
+#endif\r
+\r
+//\r
+// HH:MM:SS 形式の文字列から time_t に変換\r
+// 現在時刻が指定文字列の時刻以前の場合、当日の時刻。指定文字列の時刻よりも過ぎている場合、翌日の時刻を返す。\r
+//\r
+void Controller::getTimeWithString(String *str, time_t *time_var)\r
+{\r
+ if ((str != NULL) && str->isMatch(String::stringWithUTF8String("^\\d\\d:\\d\\d:\\d\\d$")) && (time_var != NULL))\r
+ {\r
+ // 時:分:秒 を int型に分解\r
+ std::string time_str = str->cString();\r
+ int hour = atoi(time_str.substr(0, 2).c_str());\r
+ int min = atoi(time_str.substr(3, 2).c_str());\r
+ int sec = atoi(time_str.substr(6, 2).c_str());\r
+ DebugLog2("%02d:%02d:%02d", hour, min, sec);\r
+\r
+ // 現在時刻取得\r
+ time_t now = time(NULL);\r
+ TM now_tm;\r
+ if (localtime_s(&now_tm, &now) == 0)\r
+ {\r
+ int now_sec = now_tm.tm_hour * 3600 + now_tm.tm_min * 60 + now_tm.tm_sec;\r
+ int col_sec = hour * 3600 + min * 3600 + sec;\r
+ if (now_sec > col_sec)\r
+ {\r
+ ++now_tm.tm_mday;\r
+ }\r
+ now_tm.tm_hour = hour;\r
+ now_tm.tm_min = min;\r
+ now_tm.tm_sec = sec;\r
+\r
+ *time_var = mktime(&now_tm);\r
+ }\r
+ }\r
+}\r
+\r
+void Controller::getTimeWithEPG(Dictionary *epg, time_t *start, time_t *end)\r
+{\r
+ if ((epg == NULL) || (start == NULL) || (end == NULL))\r
+ {\r
+ return;\r
+ }\r
+ String *date = epg->stringForKey(KEY_EPG_DATE);\r
+ String *st = epg->stringForKey(KEY_EPG_START);\r
+ String *ed = epg->stringForKey(KEY_EPG_END);\r
+ if ((date == NULL) || (st == NULL) || (ed == NULL))\r
+ {\r
+ return;\r
+ }\r
+\r
+ std::string dateStr = date->cString();\r
+ std::string stStr = st->cString();\r
+ std::string edStr = ed->cString();\r
+ TM tm_start;\r
+ tm_start.tm_year = atoi(dateStr.substr(0, 4).c_str()) - 1900;\r
+ tm_start.tm_mon = atoi(dateStr.substr(5, 2).c_str()) - 1;\r
+ tm_start.tm_mday = atoi(dateStr.substr(8, 2).c_str());\r
+ tm_start.tm_hour = atoi(stStr.substr(0, 2).c_str());\r
+ tm_start.tm_min = atoi(stStr.substr(3, 2).c_str());\r
+ tm_start.tm_sec = atoi(stStr.substr(6, 2).c_str());\r
+\r
+ TM tm_end;\r
+ tm_end.tm_year = atoi(dateStr.substr(0, 4).c_str()) - 1900;\r
+ tm_end.tm_mon = atoi(dateStr.substr(5, 2).c_str()) - 1;\r
+ tm_end.tm_mday = atoi(dateStr.substr(8, 2).c_str());\r
+ tm_end.tm_hour = atoi(edStr.substr(0, 2).c_str());\r
+ tm_end.tm_min = atoi(edStr.substr(3, 2).c_str());\r
+ tm_end.tm_sec = atoi(edStr.substr(6, 2).c_str());\r
+ if (stStr > edStr)\r
+ {\r
+ tm_end.tm_mday += 1;\r
+ }\r
+ *start = mktime(&tm_start);\r
+ *end = mktime(&tm_end);\r
+}\r
+\r
+} // iPTd\r
+} // ry0\r
+\r
--- /dev/null
+/**\r
+ * @file Controller.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "Raym/Raym.h"\r
+\r
+#include "keys.h"\r
+#include "ry0/device/TunerFactory.h"\r
+\r
+#include "net/HTTPDaemon.h"\r
+#include "net/RTSPRequest.h"\r
+\r
+#define VERSION "0.10"\r
+#define REVISION 12\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+typedef struct tm TM;\r
+typedef struct sockaddr SOCKADDR;\r
+typedef struct sockaddr_in SOCKADDR_IN;\r
+typedef struct _stat STAT;\r
+\r
+class Controller : public Raym::Service,\r
+ public Raym::TimerDelegate,\r
+ public NET::HTTPDaemonDelegate\r
+{\r
+private:\r
+\r
+ Raym::String * _system_path; // システムパス(実行ファイルが配置されているディレクトリ)\r
+ Raym::String * _props_path; // プロパティファイルのパス\r
+ Raym::Dictionary * _props; // プロパティ\r
+ Raym::String * _status_path; // ステータスファイルのパス\r
+ Raym::Dictionary * _status; // ステータス\r
+ Raym::String * _epgs_path; // 番組データファイルのパス\r
+\r
+ /**\r
+ * EPGデータ\r
+ *\r
+ * Root - Dictionary\r
+ * KEY_SERVICES - Dictionary\r
+ * <service_id> - Array // ソート済み\r
+ * [Item 0] - Dictionary // EPGデータ (時間で昇順にソート)\r
+ * :\r
+ * [Item X]\r
+ * <station_name> - Number // 局毎のEPG収集時間[秒]\r
+ *\r
+ * KEY_TEMP_DATA - Dictionary // ここから下は保存前に削除し、保存後に再構築する\r
+ * <service_id> - Dictionary\r
+ * KEY_CHANNELS - Array\r
+ * [Item 0] - String\r
+ * :\r
+ * [Item X]\r
+ * KEY_PROGRAMS - String\r
+ */\r
+ Raym::Dictionary * _epgs;\r
+\r
+ Raym::String * _store_path; // 録画データ格納先\r
+ int _store_remain; // 録画データ格納先ディスク残量(GB単位)\r
+\r
+ Raym::Dictionary * _reservations; // 予約情報\r
+ Raym::String * _reservations_path; // 予約情報ファイルのパス\r
+ int _reservation_seq_id; // 予約情報シーケンスID\r
+ int _idle_count; // アイドルカウンタ\r
+ int _shutdown_time; // シャットダウンするまでの時間\r
+\r
+ bool _initialized; // 初期化済み\r
+ HMODULE _multi2_dll;\r
+ bool _cancel_epg_collect_s; // EPG収集キャンセル(ISDB-S)\r
+ bool _cancel_epg_collect_t; // EPG収集キャンセル(ISDB-T)\r
+\r
+ NET::HTTPDaemon * _httpd;\r
+\r
+ Raym::Dictionary * _streaming_ctrls; // ストリーミング制御情報格納用\r
+\r
+ // 非同期処理用タイマ\r
+ Raym::Timer * _timer_restart; // 再開処理用\r
+ Raym::Timer * _timer_periodic; // 周期処理用\r
+ Raym::Timer * _timer_periodic_2; // 周期処理用2\r
+ Raym::Timer * _timer_epg_s; // EPG(ISDB-S)収集用\r
+ Raym::Timer * _timer_epg_t; // EPG(ISDB-T)収集用\r
+\r
+ Raym::String * _iptv_m3u8_local;\r
+ Raym::String * _iptv_m3u8_remote;\r
+ std::string _xmltv_channels;\r
+\r
+ enum _state\r
+ {\r
+ ST_IDLE,\r
+ ST_RUN,\r
+ ST_DONE\r
+ } _state;\r
+\r
+\r
+ void scanChannel(int tuner);\r
+ void periodic();\r
+ void periodic_2();\r
+\r
+ std::string createVideoPath(int tuner);\r
+\r
+public: // httpdからアクセス可能なように\r
+ int _tunerCount;\r
+ ry0::device::Tuner * _tuners[ry0::device::MAX_TUNERS];\r
+\r
+protected:\r
+ Controller();\r
+ ~Controller();\r
+\r
+public:\r
+ static Controller *alloc();\r
+\r
+ int restart();\r
+\r
+ bool isIdleState();\r
+\r
+ // misc\r
+ static void getTimeWithString(Raym::String *str, time_t *time_var);\r
+ static void getTimeWithEPG(Raym::Dictionary *epg, time_t *start, time_t *end);\r
+\r
+ // EPG & 予約録画関連\r
+ void collectEPGsForTuner(ry0::device::Tuner::Type type, int tuner, time_t limit);\r
+ bool collectEPGs(ry0::device::Tuner::Type type);\r
+ void removePastEPGs();\r
+ bool reserve(int service_id, int event_id);\r
+ bool reserve(Raym::Dictionary *epg);\r
+ bool reserve(int tuner, Raym::Dictionary *epg);\r
+ bool cancel(int tuner, int reserve_id);\r
+ void updateKeywordsReservation();\r
+ void updateSchedule();\r
+\r
+ // タイマ満了IF (from Timer)\r
+ void timerExpired(Raym::Timer *timer, void *userInfo);\r
+\r
+ // チューナ制御用IF\r
+ int getChannel(int tuner);\r
+ bool setChannel(int tuner, int channel);\r
+\r
+ // プロパティ取得関連\r
+ bool isTunerInitialized(int tuner);\r
+ bool isTunerEnabled(int tuner);\r
+ bool isChannelEnabled(int tuner, int channel);\r
+ Raym::Array *stationInfos(ry0::device::Tuner::Type type);\r
+ Raym::String *stationName(ry0::device::Tuner::Type type, int channel);\r
+ Raym::Array *programsForServices(Raym::Array *services);\r
+ Raym::String *Controller::stationNameForServiceID(Raym::String *service_id);\r
+\r
+\r
+ // HTTP制御関連\r
+ NET::HTTPResponse *responseWithHTML(NET::HTTPRequest *request, Raym::String *html);\r
+ NET::HTTPResponse *responseWithUTF8Text(NET::HTTPRequest *request, Raym::String *text);\r
+ NET::HTTPResponse *responseByResult(NET::HTTPRequest *request, bool result);\r
+ NET::HTTPResponse *responseForMain(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForPrograms(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForReservation(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForStatus(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForRegistCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForCancelCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForAddKeywordsCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForModKeywordsCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForReloadURI(NET::HTTPRequest *request, SOCKADDR_IN *client, const char *uri, int sec = 0);\r
+ NET::HTTPResponse *responseForPlaylist(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForXmltv(NET::HTTPRequest *request, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *responseForHLSControl(NET::HTTPRequest *request, SOCKADDR_IN *client, int tuner, int service_id, Raym::String *preset);\r
+ NET::HTTPResponse *requestTunerControl(NET::HTTPRequest *request, SOCKADDR_IN *client, int tuner);\r
+ NET::HTTPResponse *requestRTSP(NET::RTSPRequest *request, SOCKET sock, SOCKADDR_IN *client);\r
+ NET::HTTPResponse *request(NET::HTTPRequest *request, SOCKET sock, SOCKADDR_IN *client);\r
+ NET::HTTPRequest *readRequest(SOCKET sock);\r
+\r
+ // Windows用IF\r
+ void start();\r
+ void stop();\r
+ void systemWillSuspend();\r
+ void systemResumed();\r
+ void detectNonIdle();\r
+ void debugLog(const char *message);\r
+};\r
+\r
+} // iPTd\r
+} // ry0\r
--- /dev/null
+/**\r
+ * @file Extractor.cpp\r
+ *\r
+ */\r
+\r
+#include <time.h>\r
+\r
+#define DBG_LEVEL 0\r
+#include "Raym/Log.h"\r
+\r
+#include "Raym/Raym.h"\r
+#include "b25/aribstr.h"\r
+#include "ry0/iPTd/Extractor.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+Extractor::Extractor()\r
+{\r
+ _sdt = NULL;\r
+ _eit = NULL;\r
+ _analyzer.setListener(this);\r
+}\r
+\r
+Extractor::~Extractor()\r
+{\r
+ if (_sdt != NULL)\r
+ {\r
+ delete _sdt;\r
+ }\r
+}\r
+\r
+Extractor *Extractor::alloc()\r
+{\r
+ return new Extractor();\r
+}\r
+\r
+Extractor *Extractor::init()\r
+{\r
+ return this;\r
+}\r
+\r
+Dictionary *Extractor::stationInfo()\r
+{\r
+ Dictionary *result = NULL;\r
+\r
+ _analyzer.setFlag(MPEG2::TS::Analyzer::FLG_SDT, true);\r
+\r
+ RaymLock(this);\r
+\r
+ uint8_t count = 0;\r
+ while ((result == NULL) && (count++ < 32))\r
+ {\r
+ while (_sdt == NULL)\r
+ {\r
+ RaymCondWait(this);\r
+ }\r
+\r
+ if (_sdt->_table_id == 0x42)\r
+ {\r
+ result = Dictionary::dictionaryWithCapacity(0);\r
+ Array *services = Array::arrayWithCapacity(0);\r
+ result->setObject(services, KEY_SERVICES);\r
+ for (uint32_t i = 0; i < _sdt->_service_count; ++i)\r
+ {\r
+ Dictionary *service = Dictionary::dictionaryWithCapacity(0);\r
+ services->addObject(service);\r
+ char tmp[32];\r
+ sprintf_s(tmp, "%d", _sdt->_services[i]._service_id);\r
+ service->setString(tmp, KEY_SERVICE_ID);\r
+ sprintf_s(tmp, "%d", _sdt->_services[i]._desc->service_type);\r
+ service->setString(tmp, KEY_SERVICE_TYPE);\r
+ service->setBool(false, KEY_IPTV_ENABLED);\r
+ if (_sdt->_services[i]._desc->service_name_length > 0)\r
+ {\r
+ String *name = String::stringWithCString(_sdt->_services[i]._desc->service_name, ShiftJISStringEncoding);\r
+ service->setString(name, KEY_NAME);\r
+ if (i == 0)\r
+ {\r
+ result->setString(name, KEY_NAME);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ delete _sdt;\r
+ _sdt = NULL;\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ _analyzer.setFlag(MPEG2::TS::Analyzer::FLG_SDT, false);\r
+\r
+ return result;\r
+}\r
+\r
+Array *Extractor::collectEPGs(time_t limit)\r
+{\r
+ _analyzer.setFlag(MPEG2::TS::Analyzer::FLG_EIT, true);\r
+\r
+ std::vector<MPEG2::TS::EIT *> eits;\r
+\r
+ RaymLock(this);\r
+\r
+ time_t start = time(NULL);\r
+ while (true)\r
+ {\r
+ while ((_eit == NULL) && (time(NULL) < start + limit))\r
+ {\r
+ RaymCondTimedWait(this, 1000);\r
+ }\r
+\r
+ if (_eit != NULL)\r
+ {\r
+ eits.push_back(_eit);\r
+ _eit = NULL;\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ RaymUnlock(this);\r
+\r
+ _analyzer.setFlag(MPEG2::TS::Analyzer::FLG_EIT, false);\r
+\r
+ Array *result = Array::arrayWithCapacity(0);\r
+\r
+ std::vector<MPEG2::TS::EIT *>::iterator it;\r
+ for (it = eits.begin(); it != eits.end(); ++it)\r
+ {\r
+ MPEG2::TS::EIT *eit = (*it);\r
+ if ((eit->_table_id == MPEG2::TS::EIT::TABLE_ID_SELF) ||\r
+ ((MPEG2::TS::EIT::TABLE_ID_SELF_SCHEDULE_BEGIN <= eit->_table_id) && (eit->_table_id <= MPEG2::TS::EIT::TABLE_ID_SELF_SCHEDULE_END)))\r
+ {\r
+ MPEG2::TS::EIT::Event *event;\r
+ while ((event = eit->nextEvent()) != NULL)\r
+ {\r
+ char service_id[32];\r
+ sprintf_s(service_id, "%d", eit->_service_id);\r
+\r
+ char event_id[32];\r
+ sprintf_s(event_id, "%d", event->_event_id);\r
+\r
+ Dictionary *epg = NULL;\r
+\r
+ for (uint32_t i = 0; i < result->count(); ++i)\r
+ {\r
+ epg = (Dictionary *)result->objectAtIndex(i);\r
+ if (epg->stringForKey(KEY_EPG_SERVICE_ID)->isEqualToString(service_id) &&\r
+ epg->stringForKey(KEY_EPG_EVENT_ID)->isEqualToString(event_id))\r
+ {\r
+ break;\r
+ }\r
+ epg = NULL;\r
+ }\r
+\r
+ if (epg == NULL)\r
+ {\r
+ epg = Dictionary::dictionaryWithCapacity(0);\r
+ epg->setString(service_id, KEY_EPG_SERVICE_ID);\r
+ epg->setString(event_id, KEY_EPG_EVENT_ID);\r
+\r
+ char date[16];\r
+ sprintf_s(date, sizeof(date), "%02d/%02d/%02d", event->_st_year, event->_st_month, event->_st_day);\r
+ epg->setString(date, KEY_EPG_DATE);\r
+\r
+ char start[16];\r
+ sprintf_s(start, sizeof(start), "%02d:%02d:%02d", event->_st_hour, event->_st_min, event->_st_sec);\r
+ epg->setString(start, KEY_EPG_START);\r
+\r
+ int hour = event->_st_hour + event->_dur_hour;\r
+ int min = event->_st_min + event->_dur_min;\r
+ int sec = event->_st_sec + event->_dur_sec;\r
+ if (sec >= 60)\r
+ {\r
+ min += 1;\r
+ sec -= 60;\r
+ }\r
+ if (min >= 60)\r
+ {\r
+ hour += 1;\r
+ min -= 60;\r
+ }\r
+ char end[16];\r
+ sprintf_s(end, sizeof(end), "%02d:%02d:%02d", hour, min, sec);\r
+ epg->setString(end, KEY_EPG_END);\r
+\r
+ char duration[8];\r
+ sprintf_s(duration, sizeof(duration), "%d", event->_dur_hour * 3600 + event->_dur_min * 60 + event->_dur_sec);\r
+ epg->setString(duration, KEY_EPG_DURATION);\r
+\r
+ result->addObject(epg);\r
+ }\r
+\r
+ Array *ext_items = NULL;\r
+ String *ext_item_desc = NULL;\r
+ Data *ext_item = NULL;\r
+ Data *ext_text = NULL;\r
+\r
+ MPEG2::TS::Descriptor *desc;\r
+ while ((desc = event->nextDescriptor()) != NULL)\r
+ {\r
+ switch (desc->_descriptor_tag)\r
+ {\r
+ case MPEG2::TS::TAG_BOUQUET_NAME_DESCRIPTOR:\r
+ DebugLog3("TAG_BOUQUET_NAME_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_SERVICE_DESCRIPTOR:\r
+ DebugLog3("TAG_SERVICE_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_SHORT_EVENT_DESCRIPTOR:\r
+ DebugLog3("TAG_SHORT_EVENT_DESCRIPTOR\n");\r
+ if (desc->_short_event._event_name_length > 0)\r
+ {\r
+ char *tmp = (char *)malloc(desc->_short_event._event_name_length * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)desc->_short_event._event_name, desc->_short_event._event_name_length);\r
+ String *event_name = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ if (event_name != NULL)\r
+ {\r
+ epg->setString(event_name, KEY_EPG_TITLE);\r
+ }\r
+ free(tmp);\r
+ }\r
+ }\r
+ if (desc->_short_event._text_length > 0)\r
+ {\r
+ char *tmp = (char *)malloc(desc->_short_event._text_length * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)desc->_short_event._text, desc->_short_event._text_length);\r
+ String *text = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ if (text != NULL)\r
+ {\r
+ epg->setString(text, KEY_EPG_DESCRIPTION);\r
+ }\r
+ free(tmp);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_EXTENDED_EVENT_DESCRIPTOR:\r
+ DebugLog3("TAG_EXTENDED_EVENT_DESCRIPTOR\n");\r
+ {\r
+ for (int i = 0; i < desc->_extended_event._item_count; ++i)\r
+ {\r
+ if (ext_items == NULL)\r
+ {\r
+ ext_items = Array::arrayWithCapacity(0);\r
+ epg->setObject(ext_items, KEY_EPG_EXT_ITEMS);\r
+ }\r
+\r
+ if (desc->_extended_event._items[i]._item_description_length > 0)\r
+ {\r
+ if (ext_item != NULL)\r
+ {\r
+ char *tmp = (char *)malloc(ext_item->length() * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)ext_item->bytes(), ext_item->length());\r
+ String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ if (desc != NULL)\r
+ {\r
+ Dictionary *dict = Dictionary::dictionaryWithCapacity(0);\r
+ if (ext_item_desc != NULL)\r
+ {\r
+ dict->setString(ext_item_desc, KEY_EPG_EXT_ITEM_DESCRIPTION);\r
+ ext_item_desc = NULL;\r
+ }\r
+ dict->setString(desc, KEY_EPG_EXT_ITEM);\r
+ ext_items->addObject(dict);\r
+ }\r
+ free(tmp);\r
+ }\r
+ ext_item = NULL;\r
+ }\r
+\r
+ char *tmp = (char *)malloc(desc->_extended_event._items[i]._item_description_length * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)desc->_extended_event._items[i]._item_description,\r
+ desc->_extended_event._items[i]._item_description_length);\r
+ ext_item_desc = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ free(tmp);\r
+ }\r
+ else\r
+ {\r
+ ext_item_desc = NULL;\r
+ }\r
+ }\r
+\r
+ if (desc->_extended_event._items[i]._item_length > 0)\r
+ {\r
+ if (ext_item == NULL)\r
+ {\r
+ ext_item = Data::dataWithCapacity(0);\r
+ }\r
+ ext_item->appendBytes(desc->_extended_event._items[i]._item,\r
+ desc->_extended_event._items[i]._item_length);\r
+ }\r
+ }\r
+ if (desc->_extended_event._text_length > 0)\r
+ {\r
+ if (ext_text == NULL)\r
+ {\r
+ ext_text = Data::dataWithCapacity(0);\r
+ }\r
+ ext_text->appendBytes(desc->_extended_event._text, desc->_extended_event._text_length);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_CONTENT_DESCRIPTOR:\r
+ DebugLog3("TAG_CONTENT_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_SERIES_DESCRIPTOR:\r
+ DebugLog3("TAG_SERIES_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_EVENT_GROUP_DESCRIPTOR:\r
+ DebugLog3("TAG_EVENT_GROUP_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_COMPONENT_DESCRIPTOR:\r
+ DebugLog3("TAG_COMPONENT_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR:\r
+ DebugLog3("TAG_DIGITAL_COPY_CONTROL_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_AUDIO_COMPONENT_DESCRIPTOR:\r
+ DebugLog3("TAG_AUDIO_COMPONENT_DESCRIPTOR\n");\r
+ break;\r
+\r
+ case MPEG2::TS::TAG_DATA_CONTENT_DESCRIPTOR:\r
+ DebugLog3("TAG_AUDIO_COMPONENT_DESCRIPTOR\n");\r
+ break;\r
+\r
+ default:\r
+ DebugLog3("Unknown descriptor: 0x%02X\n", desc->_descriptor_tag);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (ext_item != NULL)\r
+ {\r
+ char *tmp = (char *)malloc(ext_item->length() * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)ext_item->bytes(), ext_item->length());\r
+ String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ if (desc != NULL)\r
+ {\r
+ Dictionary *dict = Dictionary::dictionaryWithCapacity(0);\r
+ if (ext_item_desc != NULL)\r
+ {\r
+ dict->setString(ext_item_desc, KEY_EPG_EXT_ITEM_DESCRIPTION);\r
+ ext_item_desc = NULL;\r
+ }\r
+ dict->setString(desc, KEY_EPG_EXT_ITEM);\r
+ ext_items->addObject(dict);\r
+ }\r
+ free(tmp);\r
+ }\r
+ ext_item = NULL;\r
+ }\r
+\r
+ if (ext_text != NULL)\r
+ {\r
+ char *tmp = (char *)malloc(ext_text->length() * 3);\r
+ if (tmp != NULL)\r
+ {\r
+ AribToString(tmp, (const char *)ext_text->bytes(), ext_text->length());\r
+ String *desc = String::stringWithCString(tmp, ShiftJISStringEncoding);\r
+ if (desc != NULL)\r
+ {\r
+ Dictionary *dict = Dictionary::dictionaryWithCapacity(0);\r
+ dict->setString("no desc", KEY_EPG_EXT_ITEM_DESCRIPTION);\r
+ dict->setString(desc, KEY_EPG_EXT_ITEM);\r
+ ext_items->addObject(dict);\r
+ }\r
+ free(tmp);\r
+ }\r
+ ext_text = NULL;\r
+ }\r
+ }\r
+ }\r
+\r
+ delete *it;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+void Extractor::put(uint8_t *buffer, uint32_t size)\r
+{\r
+ _analyzer.put(buffer, size);\r
+}\r
+\r
+void Extractor::detect(MPEG2::TS::PAT *pat)\r
+{\r
+}\r
+\r
+void Extractor::detect(MPEG2::TS::SDT *sdt)\r
+{\r
+ RaymLock(this);\r
+ if (_sdt != NULL)\r
+ {\r
+ delete _sdt;\r
+ _sdt = NULL;\r
+ }\r
+ _sdt = new MPEG2::TS::SDT(*sdt);\r
+ RaymCondSignal(this);\r
+ RaymUnlock(this);\r
+}\r
+\r
+void Extractor::detect(MPEG2::TS::EIT *eit)\r
+{\r
+ RaymLock(this);\r
+ if (_eit != NULL)\r
+ {\r
+ delete _eit;\r
+ _eit = NULL;\r
+ }\r
+ _eit = new MPEG2::TS::EIT(*eit);\r
+ RaymCondSignal(this);\r
+ RaymUnlock(this);\r
+}\r
+\r
+} // iPTd\r
+} // ry0\r
--- /dev/null
+/**\r
+ * @file Extractor.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "Raym/Raym.h"\r
+#include "ry0/device/Tuner.h"\r
+#include "mpeg2/ts/Analyzer.h"\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+class Extractor : public Raym::Object,\r
+ public ry0::device::Tuner::Listener,\r
+ public MPEG2::TS::Analyzer::Listener\r
+{\r
+private:\r
+ MPEG2::TS::Analyzer _analyzer;\r
+ MPEG2::TS::SDT * _sdt;\r
+ MPEG2::TS::EIT * _eit;\r
+\r
+protected:\r
+ Extractor();\r
+ ~Extractor();\r
+\r
+public:\r
+ static Extractor *alloc();\r
+ Extractor *init();\r
+\r
+ Raym::Dictionary *stationInfo();\r
+ Raym::Array *collectEPGs(time_t limit);\r
+\r
+ // ry0::device::Tuner::Listener\r
+ void put(uint8_t *buffer, uint32_t size);\r
+\r
+ // MPEG2::TS::Demultiplexer::Listener\r
+ void detect(MPEG2::TS::PAT *pat);\r
+ void detect(MPEG2::TS::SDT *sdt);\r
+ void detect(MPEG2::TS::EIT *eit);\r
+};\r
+\r
+} // iPTd\r
+} // ry0\r
--- /dev/null
+//
+//
+//
+
+#define DBG_LEVEL 3
+#include "Raym/Log.h"
+
+#include <process.h>
+
+#include "FFmpeg.h"
+
+using namespace Raym;
+
+namespace ry0
+{
+namespace iPTd
+{
+
+DEFINE_STATIC_MUTEX(mutex_);
+static String *ffmpeg_exe_path_ = NULL;
+
+FFmpeg::FFmpeg()
+{
+ DebugLog2("FFmpeg::FFmpeg()");
+
+ //
+ // ffmpeg.exe の確認
+ // 自アプリの実行ファイルとと同じディレクトリにある前提
+ //
+ mutex_.lock();
+ while (ffmpeg_exe_path_ == NULL)
+ {
+ FileManager *fm = FileManager::defaultManager();
+
+ // 実行ファイルのパスを取得する関数は、TrayApp にあるのだが依存したくないので直に書く
+ char execute_path[MAX_PATH + 1];
+ memset(execute_path, 0x00, sizeof(execute_path));
+
+ TCHAR strbuf[MAX_PATH + 1];
+ if (GetModuleFileName(NULL, strbuf, MAX_PATH) == 0)
+ {
+ DebugLog0("FFmpeg()::FFmpeg() GetModuleFileName() ng.");
+ break;
+ }
+
+ errno_t e;
+ size_t returnValue;
+ e = wcstombs_s(&returnValue, execute_path, sizeof(execute_path), strbuf, _TRUNCATE);
+ if (e != 0)
+ {
+ DebugLog0("FFmpeg()::FFmpeg() wcstombs_s() ng.");
+ break;
+ }
+
+ char *p = strrchr(execute_path, '\\');
+ if (p == NULL)
+ {
+ DebugLog0("FFmpeg()::FFmpeg() strrchr() ng.");
+ break;
+ }
+ ++p;
+ *p = '\0';
+ strcat_s(execute_path, sizeof(execute_path), "ffmpeg.exe");
+
+ String *path = String::alloc()->initWithUTF8String(execute_path);
+ if (path == NULL)
+ {
+ DebugLog0("FFmpeg()::FFmpeg() initWithUTF8String() ng.");
+ break;
+ }
+
+ bool isDirectory = false;
+ if (fm->fileExistsAtPath(path, &isDirectory))
+ {
+ if (!isDirectory)
+ {
+ ffmpeg_exe_path_ = path;
+ ((Object *)ffmpeg_exe_path_)->autorelease(true);
+ break;
+ }
+ else
+ {
+ DebugLog0("FFmpeg()::FFmpeg() is directory: \"%s\"", execute_path);
+ }
+ }
+ else
+ {
+ DebugLog0("FFmpeg()::FFmpeg() not found: \"%s\"", execute_path);
+ }
+ path->release();
+
+ break;
+ }
+ mutex_.unlock();
+
+ // メンバ初期化
+
+}
+
+FFmpeg::~FFmpeg()
+{
+ stop();
+
+ // メンバ解放
+
+ DebugLog2("FFmpeg::~FFmpeg()");
+}
+
+FFmpeg *FFmpeg::alloc()
+{
+ DebugLog2("FFmpeg::alloc()");
+
+ return new FFmpeg();
+}
+
+FFmpeg *FFmpeg::init()
+{
+ DebugLog2("FFmpeg::init()");
+
+ if (CommandRunner::init() == NULL)
+ {
+ release();
+ return NULL;
+ }
+
+ return this;
+}
+
+FFmpeg *FFmpeg::retain()
+{
+ DebugLog2("FFmpeg::retain()");
+
+ CommandRunner::retain();
+ return this;
+}
+
+FFmpeg *FFmpeg::autorelease()
+{
+ DebugLog2("FFmpeg::autorelease()");
+
+ CommandRunner::autorelease();
+ return this;
+}
+
+bool FFmpeg::start()
+{
+ DebugLog2("FFmpeg::start()");
+
+ setCommandPath(ffmpeg_exe_path_);
+
+ return CommandRunner::start();
+}
+
+bool FFmpeg::readLine(String *line)
+{
+ return false;
+}
+
+const char *FFmpeg::className()
+{
+ return "FFmpeg";
+}
+
+#ifndef _WIN32
+#pragma mark '
+#pragma mark ------- util -------
+#endif
+
+Array *STR_ARRAY(const char *str, ...)
+{
+ Array *result = Array::arrayWithCapacity(0);
+
+ if (str != NULL)
+ {
+ result->addObject(String::stringWithUTF8String(str));
+
+ va_list ap;
+ va_start(ap, str);
+ while (true)
+ {
+ const char *p = va_arg(ap, const char *);
+ if (p == NULL)
+ {
+ break;
+ }
+ result->addObject(String::stringWithUTF8String(p));
+ }
+ va_end(ap);
+ }
+
+ return result;
+}
+/*
+Dictionary *MODULE(const char *name, Array *opts)
+{
+ Dictionary *result = Dictionary::dictionaryWithCapacity(0);
+ result->setObject(opts, name);
+ return result;
+}*/
+
+/*
+Dictionary *KEY_VAL(const char *key, const char *value)
+{
+ Dictionary *result = Dictionary::dictionaryWithCapacity(0);
+ result->setString(value, key);
+ return result;
+}
+
+Dictionary *KEY_VAL(const char *key, String *value)
+{
+ Dictionary *result = Dictionary::dictionaryWithCapacity(0);
+ result->setString(value, key);
+ return result;
+}
+
+Dictionary *KEY_VAL(const char *key, Dictionary *value)
+{
+ Dictionary *result = Dictionary::dictionaryWithCapacity(0);
+ result->setObject(value, key);
+ return result;
+}*/
+
+} // iPTd
+} // ry0
--- /dev/null
+//\r
+//\r
+//\r
+\r
+#pragma once\r
+\r
+#include "ry0/iPTd/CommandRunner.h"\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+Raym::Array *STR_ARRAY(const char *str, ...);\r
+\r
+class FFmpeg : public CommandRunner\r
+{\r
+private:\r
+\r
+\r
+protected:\r
+ FFmpeg();\r
+ ~FFmpeg();\r
+\r
+ virtual bool readLine(Raym::String *line);\r
+\r
+public:\r
+ static FFmpeg *alloc();\r
+ FFmpeg *init();\r
+ FFmpeg *retain();\r
+ FFmpeg *autorelease();\r
+\r
+// void setSource(Raym::String *source);\r
+// void setOutput(Raym::String *output);\r
+\r
+ bool start();\r
+\r
+ virtual const char *className();\r
+};\r
+\r
+} // iPTd\r
+} // ry0\r
--- /dev/null
+//
+//
+//
+
+#define DBG_LEVEL 3
+#include "Raym/Log.h"
+
+#include "HTTPLiveStreaming.h"
+
+using namespace Raym;
+
+namespace ry0
+{
+namespace iPTd
+{
+
+HTTPLiveStreaming::HTTPLiveStreaming()
+{
+ DebugLog2("HTTPLiveStreaming::HTTPLiveStreaming()");
+
+ _source = NULL;
+ _output_path = NULL;
+ _index_name = NULL;
+ _base_url = NULL;
+ _counter = 0;
+}
+
+HTTPLiveStreaming::~HTTPLiveStreaming()
+{
+ RELEASE(_source);
+ RELEASE(_output_path);
+ RELEASE(_index_name);
+ RELEASE(_base_url);
+
+ DebugLog2("HTTPLiveStreaming::~HTTPLiveStreaming()");
+}
+
+HTTPLiveStreaming *HTTPLiveStreaming::alloc()
+{
+ DebugLog2("HTTPLiveStreaming::alloc()");
+
+ return new HTTPLiveStreaming();
+}
+
+HTTPLiveStreaming *HTTPLiveStreaming::init()
+{
+ DebugLog2("HTTPLiveStreaming::init()");
+
+ if (FFmpeg::init() == NULL)
+ {
+ release();
+ return NULL;
+ }
+
+ return this;
+}
+
+HTTPLiveStreaming *HTTPLiveStreaming::retain()
+{
+ DebugLog2("HTTPLiveStreaming::retain()");
+
+ FFmpeg::retain();
+ return this;
+}
+
+HTTPLiveStreaming *HTTPLiveStreaming::autorelease()
+{
+ DebugLog2("HTTPLiveStreaming::autorelease()");
+
+ FFmpeg::autorelease();
+ return this;
+}
+
+void HTTPLiveStreaming::setSource(String *source)
+{
+ DebugLog2("HTTPLiveStreaming::setSource()");
+
+ RELEASE(_source);
+ if (source != NULL)
+ {
+ _source = source->retain();
+ }
+}
+
+void HTTPLiveStreaming::setOutputPath(String *output_path)
+{
+ DebugLog2("HTTPLiveStreaming::setOutputPath()");
+
+ RELEASE(_output_path);
+ if (output_path != NULL)
+ {
+ _output_path = output_path->retain();
+ }
+}
+
+String *HTTPLiveStreaming::outputPath()
+{
+ return _output_path;
+}
+
+void HTTPLiveStreaming::setIndexName(String *index_name)
+{
+ DebugLog2("HTTPLiveStreaming::setIndexName()");
+
+ RELEASE(_index_name);
+ if (index_name != NULL)
+ {
+ _index_name = index_name->retain();
+ }
+}
+
+bool HTTPLiveStreaming::start()
+{
+ DebugLog2("%s", __FUNCTION__);
+
+ if ((_output_path == NULL) || (_source == NULL) || (_index_name == NULL))
+ {
+ return false;
+ }
+
+ DebugLog2("output path: %s", _output_path->cString());
+ DebugLog2("source: %s", _source->cString());
+ DebugLog2("index: %s", _index_name->cString());
+
+ String *index_path = indexPath();
+ if (index_path != NULL)
+ {
+ FileManager::defaultManager()->removeItemAtPath(index_path, NULL);
+ }
+
+ //
+ // %>ffmpeg -i C:\WORK\20151024_211758_086_PT2@050000-01.ts -vcodec libx264 -r 30000/1001 -aspect 16:9 -s 1280x720
+ // -bufsize 20000k -maxrate 25000k -acodec libvo_aacenc -ac
+ // 2 -ar 48000 -ab 128k -threads 2 -f segment -segment_format mpegts -segment_time 10 -segment_list index.m3u8 test%03d.ts
+ //
+
+ // 暫定処理
+// Array *args = STR_ARRAY("-i", "C:\\WORK\\20151024_211758_086_PT2@050000-01.ts",
+// Array *args = STR_ARRAY("-i", "udp://0.0.0.0:51027",
+#if 0
+ Array *arg2 = STR_ARRAY("-i", "udp://@0.0.0.0:51027?overrun_nonfatal=1&fifo_size=50000000",
+// Array *args = STR_ARRAY("-i", "udp://@51027?overrun_nonfatal=1&fifo_size=50000000",
+ "-vcodec", "libx264",
+ "-r", "30000/1001",
+ "-aspect", "16:9",
+ "-s", "1280x720",
+ "-bufsize", "20000k",
+ "-maxrate", "25000k",
+ "-acodec", "libvo_aacenc",
+ "-ac", "2",
+ "-ar", "48000",
+ "-ab", "128k",
+ "-threads", "2",
+// "-programid", "1074",
+ "-f", "segment",
+ "-segment_format", "mpegts",
+ "-segment_time", "10",
+ "-segment_list", "C:\\WORK\\www\\index.m3u8",
+ "C:\\WORK\\www\\test%03d.ts",
+ NULL);
+#endif
+
+ Array *args = Array::arrayWithCapacity(0);
+ args->addObject(String::stringWithUTF8String("-i"));
+// args->addObject(String::stringWithUTF8String("udp://@0.0.0.0:51027?overrun_nonfatal=1&fifo_size=50000000"));
+ if (_source->hasPrefix("udp://"))
+ {
+ args->addObject(String::stringWithFormat("%s?overrun_nonfatal=1&fifo_size=50000000", _source->cString()));
+ }
+ else
+ {
+ args->addObject(String::stringWithUTF8String("hogehoge"));
+ }
+
+ args->addObject(String::stringWithUTF8String("-vcodec"));
+ args->addObject(String::stringWithUTF8String("libx264"));
+ args->addObject(String::stringWithUTF8String("-r"));
+ args->addObject(String::stringWithUTF8String("30000/1001"));
+ args->addObject(String::stringWithUTF8String("-aspect"));
+ args->addObject(String::stringWithUTF8String("16:9"));
+// args->addObject(String::stringWithUTF8String("-s"));
+// args->addObject(String::stringWithUTF8String("1280x720"));
+ args->addObject(String::stringWithUTF8String("-g"));
+ args->addObject(String::stringWithUTF8String("150"));
+ args->addObject(String::stringWithUTF8String("-bufsize"));
+ args->addObject(String::stringWithUTF8String("20000k"));
+ args->addObject(String::stringWithUTF8String("-maxrate"));
+ args->addObject(String::stringWithUTF8String("25000k"));
+ args->addObject(String::stringWithUTF8String("-acodec"));
+ args->addObject(String::stringWithUTF8String("libvo_aacenc"));
+ args->addObject(String::stringWithUTF8String("-ac"));
+ args->addObject(String::stringWithUTF8String("2"));
+ args->addObject(String::stringWithUTF8String("-ar"));
+ args->addObject(String::stringWithUTF8String("48000"));
+ args->addObject(String::stringWithUTF8String("-ab"));
+ args->addObject(String::stringWithUTF8String("128k"));
+ args->addObject(String::stringWithUTF8String("-threads"));
+ args->addObject(String::stringWithUTF8String("2"));
+ args->addObject(String::stringWithUTF8String("-f"));
+ args->addObject(String::stringWithUTF8String("segment"));
+ args->addObject(String::stringWithUTF8String("-segment_format"));
+ args->addObject(String::stringWithUTF8String("mpegts"));
+ args->addObject(String::stringWithUTF8String("-segment_time"));
+ args->addObject(String::stringWithUTF8String("10"));
+
+ args->addObject(String::stringWithUTF8String("-segment_list"));
+ args->addObject(_output_path->stringByAppendingPathComponent(String::stringWithFormat("%s.m3u8", _index_name->cString())));
+
+ args->addObject(_output_path->stringByAppendingPathComponent(String::stringWithUTF8String("streaming-%05d.ts")));
+
+ setArguments(args);
+
+ return FFmpeg::start();
+}
+
+String * HTTPLiveStreaming::indexPath()
+{
+ if ((_output_path == NULL) || (_index_name == NULL))
+ {
+ return false;
+ }
+ return _output_path->stringByAppendingPathComponent(String::stringWithFormat("%s.m3u8", _index_name->cString()));
+}
+
+
+bool HTTPLiveStreaming::readLine(String *line)
+{
+ if (line != NULL)
+ {
+// DebugLog3("ffmpeg: %s", line->cString());
+ }
+ return false;
+}
+
+const char *HTTPLiveStreaming::className()
+{
+ return "HTTPLiveStreaming";
+}
+
+} // iPTd
+} // ry0
--- /dev/null
+//
+//
+//
+
+#pragma once
+
+#include "Raym/Raym.h"
+#include "ry0/iPTd/FFmpeg.h"
+
+namespace ry0
+{
+namespace iPTd
+{
+
+class HTTPLiveStreaming : public FFmpeg
+{
+private:
+ Raym::String * _source;
+ Raym::String * _output_path;
+ Raym::String * _index_name;
+ Raym::String * _base_url;
+ int _counter;
+
+protected:
+ HTTPLiveStreaming();
+ ~HTTPLiveStreaming();
+
+ virtual bool readLine(Raym::String *line);
+
+public:
+ void run();
+
+public:
+ static HTTPLiveStreaming *alloc();
+ HTTPLiveStreaming *init();
+ HTTPLiveStreaming *retain();
+ HTTPLiveStreaming *autorelease();
+
+ void setSource(Raym::String *source);
+ void setOutputPath(Raym::String *output_path);
+ Raym::String *outputPath();
+ void setIndexName(Raym::String *index_name);
+
+ bool start();
+
+ Raym::String *indexPath();
+
+ virtual const char *className();
+};
+
+} // iPTd
+} // ry0
--- /dev/null
+/**\r
+ * @file TrayApp.cpp\r
+ *\r
+ */\r
+\r
+\r
+#define DBG_LEVEL 0\r
+#include <Raym/Log.h>\r
+\r
+#include <time.h>\r
+#include <direct.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <io.h>\r
+#include <share.h>\r
+#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
+#include <Iphlpapi.h>\r
+\r
+#include "ry0/iPTd/TrayApp.h"\r
+\r
+using namespace Raym;\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+static const char *PLIST_PREFIX = "com.gmail.tim.and.pom";\r
+static const int DEF_FORCED_SHUTDOWN = 120; // 強制シャットダウンするまでの時間(分単位)\r
+\r
+bool TrayApp::canTerminate()\r
+{\r
+ return true;\r
+}\r
+\r
+/*\r
+ * TrayApp::WndProc() からコールされる\r
+ *\r
+ * スレッドコンテキスト:メインスレッド\r
+ */\r
+void TrayApp::systemWillSuspend()\r
+{\r
+ DebugLog2("TrayApp::systemWillSuspend()");\r
+}\r
+\r
+/*\r
+ * TrayApp::WndProc() からコールされる\r
+ *\r
+ * スレッドコンテキスト:メインスレッド\r
+ */\r
+void TrayApp::systemResumed()\r
+{\r
+ DebugLog2("TrayApp::systemResumed()");\r
+}\r
+\r
+/*\r
+ * TrayApp::WndProc() からコールされる\r
+ *\r
+ * スレッドコンテキスト:メインスレッド\r
+ */\r
+void TrayApp::detectIdle()\r
+{\r
+ DebugLog2("TrayApp::detectIdle()");\r
+\r
+ // ここはメインスレッドなのでARPを用意する\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ if (_idle_count == 0)\r
+ {\r
+ DebugLog0("detect idle...");\r
+ }\r
+\r
+ // アイドルカウンタを更新\r
+ ++_idle_count;\r
+\r
+ // 起動中アプリと休止状態抑止アプリのチェック\r
+ bool found = false;\r
+\r
+ Array *dont_in_suspend = _props->arrayForKey(KEY_DO_NOT_IN_SHUTDOWN);\r
+ Array *running_apps = Workspace::sharedWorkspace()->runningApplications();\r
+ for (uint i = 0; (i < running_apps->count()) && !found; ++i)\r
+ {\r
+ RunningApplication *ra = (RunningApplication *)running_apps->objectAtIndex(i);\r
+\r
+ // 実行中でなければ次へ\r
+ if (!ra->isRunning())\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // 実行ファイルのチェック\r
+ String *path = ra->executePath();\r
+ if ((path == NULL) || (path->length() == 0))\r
+ {\r
+ continue;\r
+ }\r
+ DebugLog3("exec path: %s", path->cString());\r
+\r
+ // 休止状態抑止アプリリストのチェック\r
+ for (uint j = 0; (j < dont_in_suspend->count()) && !found; ++j)\r
+ {\r
+ found = path->isMatch((String *)dont_in_suspend->objectAtIndex(j));\r
+ }\r
+ }\r
+\r
+ // 抑止有効なら KEY_FORCED_SUSPEND_TIME、無効なら KEY_SUSPEND_TIME で取得\r
+ int limit = _props->integerForKey(KEY_FORCED_SHUTDOWN);\r
+ if (found && (_idle_count < limit))\r
+ {\r
+ notification();\r
+ }\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ // ARP解放\r
+ pool->release();\r
+}\r
+\r
+void TrayApp::detectNonIdle()\r
+{\r
+ DebugLog2("TrayApp::detectNonIdle()");\r
+\r
+ // lock\r
+ RaymLock(this);\r
+\r
+ if (_idle_count > 0)\r
+ {\r
+ DebugLog0("detect non idle...");\r
+ }\r
+ _idle_count = 0;\r
+\r
+ // unlock\r
+ RaymUnlock(this);\r
+\r
+ notification();\r
+}\r
+\r
+int TrayApp::start()\r
+{\r
+ // ログファイル数設定\r
+ // 設定以前にログ出力しないこと\r
+ Raym::LOG_NUM_MAX = 8;\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("");\r
+ DebugLog0("global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ //\r
+ AutoreleasePool *pool = AutoreleasePool::alloc()->init();\r
+\r
+ // メンバ初期化\r
+ _system_path = NULL;\r
+ _props = NULL;\r
+ _idle_count = 0;\r
+\r
+ DebugLog0("");\r
+ DebugLog0("------------------------------------------------------------------------");\r
+ DebugLog0("iPTd ver %s (rev.%d)", VERSION, REVISION);\r
+ DebugLog0("initialize...");\r
+\r
+ int result = 0;\r
+\r
+ // 初期化\r
+ while (true)\r
+ {\r
+ // システムパス設定\r
+ _system_path = String::stringWithFormat("%s", GetExecutePath());\r
+ if (_system_path == NULL)\r
+ {\r
+ DebugLog0("error: GetExecutePath()");\r
+ result = -1;\r
+ break;\r
+ }\r
+ _system_path = _system_path->stringByReplacingOccurrencesOfString("iPTd.exe", "");\r
+ _system_path->retain();\r
+ DebugLog2("_system_path: %s", _system_path->cString());\r
+\r
+ // プロパティの読み込み\r
+ _props = Dictionary::alloc()->initWithContentsOfFile(String::stringWithFormat("%s%s.iptd.plist", _system_path->cString(), PLIST_PREFIX));\r
+ if (_props == NULL)\r
+ {\r
+ DebugLog0("property file read ng.");\r
+ result = -1;\r
+ break;\r
+ }\r
+\r
+ if (_props->integerForKey(KEY_HTTP_PORT) == 0)\r
+ {\r
+ DebugLog0("property check ng. 00");\r
+ result = -1;\r
+ break;\r
+ }\r
+\r
+ // 強制シャットダウンまでの時間\r
+ if ((_props->integerForKey(KEY_FORCED_SHUTDOWN) == 0) || (_props->integerForKey(KEY_FORCED_SHUTDOWN) < DEF_FORCED_SHUTDOWN))\r
+ {\r
+ DebugLog0("property check ng. 01");\r
+ result = -1;\r
+ break;\r
+ }\r
+\r
+ // シャットダウン抑止アプリリスト\r
+ if (_props->arrayForKey(KEY_DO_NOT_IN_SHUTDOWN) == NULL)\r
+ {\r
+ DebugLog0("property check ng. 02");\r
+ result = -1;\r
+ break;\r
+ }\r
+\r
+ // プロパティの確認\r
+ DebugLog0(" Forced Shutdown : %d min", _props->integerForKey(KEY_FORCED_SHUTDOWN));\r
+ Array *apps = _props->arrayForKey(KEY_DO_NOT_IN_SHUTDOWN);\r
+ DebugLog0(" Do not in shutdown :");\r
+ for (uint i = 0; i < apps->count(); ++i)\r
+ {\r
+ DebugLog0(" RegExp[%02d] : %s", i, ((String *)apps->objectAtIndex(i))->cString());\r
+ }\r
+\r
+ result = Application::start();\r
+ break;\r
+ }\r
+\r
+ // 解放\r
+ RELEASE(_system_path);\r
+ RELEASE(_props);\r
+\r
+ pool->release();\r
+\r
+ // 終了\r
+ DebugLog0("finished.");\r
+\r
+#ifdef RAYM_MEMORY_CHECK\r
+ DebugLog0("global_raym_count_ = %d", Raym::global_raym_count_);\r
+#endif\r
+\r
+ return result;\r
+}\r
+\r
+TrayApp::TrayApp()\r
+{\r
+}\r
+\r
+TrayApp::~TrayApp()\r
+{\r
+}\r
+\r
+TrayApp *TrayApp::alloc()\r
+{\r
+ return new TrayApp();\r
+}\r
+\r
+void TrayApp::notification()\r
+{\r
+ char http_req[256];\r
+ sprintf_s(http_req, "http://localhost:%d/non_idle.xml", _props->integerForKey(KEY_HTTP_PORT));\r
+ URL *url = URL::URLWithString(http_req);\r
+ URLRequest *req = URLRequest::requestWithURL(url);\r
+ URLResponse *resp = NULL;\r
+ Error *error = NULL;\r
+ Data *data = URLConnection::sendSynchronousRequest(req, &resp, &error);\r
+}\r
+\r
+} // iPTd\r
+} // ry0\r
+\r
+/*\r
+ * Win32 アプリケーションの初期エントリポイント\r
+ */\r
+int WINAPI wWinMain(_In_ HINSTANCE hInstance,\r
+ _In_opt_ HINSTANCE hPrevInstance,\r
+ _In_ LPTSTR lpCmdLine,\r
+ _In_ int nCmdShow)\r
+{\r
+ return ApplicationMain(ry0::iPTd::TrayApp, TEXT("ry0.app.iptd"), hInstance, hPrevInstance, lpCmdLine, nCmdShow);\r
+}\r
+\r
--- /dev/null
+/**\r
+ * @file TrayApp.h\r
+ *\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "Raym/Raym.h"\r
+\r
+#include "keys.h"\r
+\r
+#define VERSION "0.05"\r
+#define REVISION 37\r
+\r
+namespace ry0\r
+{\r
+namespace iPTd\r
+{\r
+\r
+class TrayApp : public Raym::Application\r
+{\r
+private:\r
+\r
+ Raym::String * _system_path; // システムパス(実行ファイルが配置されているディレクトリ)\r
+ Raym::Dictionary * _props; // プロパティ\r
+ int _idle_count; // アイドルカウンタ\r
+\r
+ void notification();\r
+\r
+protected:\r
+ TrayApp();\r
+ ~TrayApp();\r
+\r
+public:\r
+ static TrayApp *alloc();\r
+\r
+ // Windows用IF (from TrayApp)\r
+ int start(); // エントリポイント\r
+ void systemWillSuspend();\r
+ void systemResumed();\r
+ void detectIdle();\r
+ void detectNonIdle();\r
+ bool canTerminate();\r
+ void debugLog(const char *message);\r
+};\r
+\r
+} // iPTd\r
+} // ry0\r