From fe545f2982ba9c2177cff04c26b8aca9f6c9cf0c Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Fri, 21 Feb 2014 17:44:54 +0900 Subject: [PATCH 01/15] Reinitialize repository. --- .gitignore | 108 ++++++++ LICENSE | 20 ++ README.md | 3 + src/.gitignore | 6 - src/CSharp/CSharp.sln | 20 -- src/CSharp/FelicaLib.cs | 288 -------------------- src/CSharp/FelicaLib.csproj | 54 ---- src/CSharp/Properties/AssemblyInfo.cs | 35 --- src/CSharp/Sample.cs | 75 ------ src/ChangeLog.txt | 43 --- src/FelicaLib.sln | 66 ----- src/README.txt | 13 - src/doxygen.conf | 232 ---------------- src/dump/FelicaDump.vcproj | 353 ------------------------ src/dump/FelicaDump.vcxproj | 180 ------------- src/dump/FelicaDump.vcxproj.filters | 22 -- src/dump/dump.c | 164 ------------ src/edy/edy.c | 190 ------------- src/edy/edy.vcproj | 347 ------------------------ src/edy/edy.vcxproj | 174 ------------ src/edy/edy.vcxproj.filters | 22 -- src/include/felicalib.h | 123 --------- src/lib/felicaint.h | 149 ----------- src/lib/felicalib.c | 370 ------------------------- src/lib/felicalib.def | 15 -- src/lib/felicalib.rc | 103 ------- src/lib/felicalib.vcproj | 371 -------------------------- src/lib/felicalib.vcxproj | 184 ------------- src/lib/felicalib.vcxproj.filters | 46 ---- src/lib/felicalib64.def | 15 -- src/lib/resource.h | 14 - src/nanaco/nanaco.c | 145 ---------- src/nanaco/nanaco.vcproj | 357 ------------------------- src/nanaco/nanaco.vcxproj | 181 ------------- src/nanaco/nanaco.vcxproj.filters | 22 -- src/suica/suica.c | 219 --------------- src/suica/suica.vcproj | 351 ------------------------ src/suica/suica.vcxproj | 175 ------------ src/suica/suica.vcxproj.filters | 22 -- src/testap/testap.c | 84 ------ src/testap/testap.vcproj | 199 -------------- web/Library/AdsenseBanner.lbi | 12 - web/Templates/Main.dwt | 95 ------- web/document.html | 141 ---------- web/download.html | 123 --------- web/index.html | 134 ---------- web/license.html | 112 -------- web/links.html | 129 --------- web/requirement.html | 127 --------- web/style.css | 134 ---------- web/title.jpg | Bin 9764 -> 0 bytes web/title.png | Bin 119745 -> 0 bytes web/wiki.html | 112 -------- 53 files changed, 131 insertions(+), 6548 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md delete mode 100644 src/.gitignore delete mode 100644 src/CSharp/CSharp.sln delete mode 100644 src/CSharp/FelicaLib.cs delete mode 100644 src/CSharp/FelicaLib.csproj delete mode 100644 src/CSharp/Properties/AssemblyInfo.cs delete mode 100644 src/CSharp/Sample.cs delete mode 100644 src/ChangeLog.txt delete mode 100644 src/FelicaLib.sln delete mode 100644 src/README.txt delete mode 100644 src/doxygen.conf delete mode 100755 src/dump/FelicaDump.vcproj delete mode 100644 src/dump/FelicaDump.vcxproj delete mode 100644 src/dump/FelicaDump.vcxproj.filters delete mode 100644 src/dump/dump.c delete mode 100644 src/edy/edy.c delete mode 100644 src/edy/edy.vcproj delete mode 100644 src/edy/edy.vcxproj delete mode 100644 src/edy/edy.vcxproj.filters delete mode 100644 src/include/felicalib.h delete mode 100644 src/lib/felicaint.h delete mode 100644 src/lib/felicalib.c delete mode 100644 src/lib/felicalib.def delete mode 100644 src/lib/felicalib.rc delete mode 100755 src/lib/felicalib.vcproj delete mode 100644 src/lib/felicalib.vcxproj delete mode 100644 src/lib/felicalib.vcxproj.filters delete mode 100644 src/lib/felicalib64.def delete mode 100644 src/lib/resource.h delete mode 100644 src/nanaco/nanaco.c delete mode 100755 src/nanaco/nanaco.vcproj delete mode 100644 src/nanaco/nanaco.vcxproj delete mode 100644 src/nanaco/nanaco.vcxproj.filters delete mode 100644 src/suica/suica.c delete mode 100644 src/suica/suica.vcproj delete mode 100644 src/suica/suica.vcxproj delete mode 100644 src/suica/suica.vcxproj.filters delete mode 100644 src/testap/testap.c delete mode 100644 src/testap/testap.vcproj delete mode 100644 web/Library/AdsenseBanner.lbi delete mode 100644 web/Templates/Main.dwt delete mode 100644 web/document.html delete mode 100644 web/download.html delete mode 100644 web/index.html delete mode 100644 web/license.html delete mode 100644 web/links.html delete mode 100644 web/requirement.html delete mode 100644 web/style.css delete mode 100644 web/title.jpg delete mode 100644 web/title.png delete mode 100644 web/wiki.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bdc3535 --- /dev/null +++ b/.gitignore @@ -0,0 +1,108 @@ +# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) +[Bb]in/ +[Oo]bj/ + +# mstest test results +TestResults + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.log +*.vspscc +*.vssscc +.builds + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper* + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Publish Web Output +*.Publish.xml + +# NuGet Packages Directory +packages + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +[Bb]in +[Oo]bj +sql +TestResults +[Tt]est[Rr]esult* +*.Cache +ClientBin +[Ss]tyle[Cc]op.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a62f679 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +© 2014 Keiho Sakapon. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f6c65d1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## felicalib + +FeliCa access wrapper library. diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 5c7aab6..0000000 --- a/src/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*~ -*.user -*.suo -*.ncb -*.bak -*.sdf diff --git a/src/CSharp/CSharp.sln b/src/CSharp/CSharp.sln deleted file mode 100644 index 2afc557..0000000 --- a/src/CSharp/CSharp.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FelicaLib", "FelicaLib.csproj", "{12FF6866-AE11-419C-8EE0-0915D77A699C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {12FF6866-AE11-419C-8EE0-0915D77A699C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12FF6866-AE11-419C-8EE0-0915D77A699C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12FF6866-AE11-419C-8EE0-0915D77A699C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12FF6866-AE11-419C-8EE0-0915D77A699C}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/CSharp/FelicaLib.cs b/src/CSharp/FelicaLib.cs deleted file mode 100644 index d01f10e..0000000 --- a/src/CSharp/FelicaLib.cs +++ /dev/null @@ -1,288 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007-2010, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/// -/// Porting to x64 systems by DeForest(Hirokazu Hayashi) -/// - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.InteropServices; -using System.Reflection; - -namespace FelicaLib -{ - /// - /// DLL’x‰„ƒoƒCƒ“ƒfƒBƒ“ƒOƒNƒ‰ƒX - /// - public class BindDLL : IDisposable - { - [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] - private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPWStr)] string lpFileName); - [DllImport("kernel32", SetLastError = true)] - private static extern bool FreeLibrary(IntPtr hModule); - [DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)] - private static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName); - - private IntPtr _pModule; - - /// - /// DLL‚̃[ƒhEƒIƒuƒWƒFƒNƒg¶¬ - /// - /// ƒoƒCƒ“ƒh‚·‚éDLL–¼ - public BindDLL(string szFilename) - { - _pModule = BindDLL.LoadLibrary(szFilename); - if (_pModule != IntPtr.Zero) - { - return; - } - int nResult = Marshal.GetHRForLastWin32Error(); - throw Marshal.GetExceptionForHR(nResult); - } - - /// - /// Žw’è–¼‚̃Aƒ“ƒ}ƒl[ƒWŠÖ”ƒ|ƒCƒ“ƒ^‚ðƒfƒŠƒQ[ƒg‚É•ÏŠ· - /// - /// ƒAƒ“ƒ}ƒl[ƒWŠÖ”–¼ - /// •ÏŠ·‚·‚éƒfƒŠƒQ[ƒg‚ÌType - /// •ÏŠ·‚µ‚½ƒfƒŠƒQ[ƒg - public Delegate GetDelegate(string szProcName, Type typDelegate) - { - IntPtr pProc = BindDLL.GetProcAddress(_pModule, szProcName); - if (pProc != IntPtr.Zero) - { - Delegate oDG = Marshal.GetDelegateForFunctionPointer(pProc, typDelegate); - return oDG; - } - int nResult = Marshal.GetHRForLastWin32Error(); - throw Marshal.GetExceptionForHR(nResult); - } - - #region IDisposable ƒƒ“ƒo - - public void Dispose() - { - if (_pModule != IntPtr.Zero) - { - BindDLL.FreeLibrary(_pModule); - } - } - - #endregion - } - - // ƒVƒXƒeƒ€ƒR[ƒh - enum SystemCode : int - { - Any = 0xffff, // ANY - Common = 0xfe00, // ‹¤’ʗ̈æ - Cyberne = 0x0003, // ƒTƒCƒoƒl—̈æ - - Edy = 0xfe00, // Edy (=‹¤’ʗ̈æ) - Suica = 0x0003, // Suica (=ƒTƒCƒoƒl—̈æ) - QUICPay = 0x04c1, // QUICPay - } - - public class Felica : IDisposable - { - // ’x‰„ƒ[ƒh—pDelegate’è‹` - private delegate IntPtr Pasori_open(String dummy); - private delegate int Pasori_close(IntPtr p); - private delegate int Pasori_init(IntPtr p); - private delegate IntPtr Felica_polling(IntPtr p, ushort systemcode, byte rfu, byte time_slot); - private delegate void Felica_free(IntPtr f); - private delegate void Felica_getidm(IntPtr f, byte[] data); - private delegate void Felica_getpmm(IntPtr f, byte[] data); - private delegate int Felica_read_without_encryption02(IntPtr f, int servicecode, int mode, byte addr, byte[] data); - - // ’x‰„ƒ[ƒh—pDelegate - private Pasori_open pasori_open = null; - private Pasori_close pasori_close = null; - private Pasori_init pasori_init = null; - private Felica_polling felica_polling = null; - private Felica_free felica_free = null; - private Felica_getidm felica_getidm = null; - private Felica_getpmm felica_getpmm = null; - private Felica_read_without_encryption02 felica_read_without_encryption02 = null; - - private string szDLLname = ""; - private BindDLL bdDLL = null; - - private IntPtr pasorip = IntPtr.Zero; - private IntPtr felicap = IntPtr.Zero; - - /// - /// ƒRƒ“ƒXƒgƒ‰ƒNƒ^ - /// - public Felica() - { - // x64‘Ήž 20100501 - DeForest - try - { - // ƒvƒ‰ƒbƒgƒtƒH[ƒ€•Ê‚̃[ƒhƒ‚ƒWƒ…[ƒ‹–¼Œˆ’èix64/x86ƒTƒ|[ƒgAItenium‚̓Tƒ|[ƒgŠOj - if (System.IntPtr.Size >= 8) // x64 - { - szDLLname = "felicalib64.dll"; - } - else // x86 - { - szDLLname = "felicalib.dll"; - } - // DLLƒ[ƒh - bdDLL = new BindDLL(szDLLname); - // ƒGƒ“ƒgƒŠ[Žæ“¾ - pasori_open = (Pasori_open)bdDLL.GetDelegate("pasori_open", typeof(Pasori_open)); - pasori_close = (Pasori_close)bdDLL.GetDelegate("pasori_close", typeof(Pasori_close)); - pasori_init = (Pasori_init)bdDLL.GetDelegate("pasori_init", typeof(Pasori_init)); - felica_polling = (Felica_polling)bdDLL.GetDelegate("felica_polling", typeof(Felica_polling)); - felica_free = (Felica_free)bdDLL.GetDelegate("felica_free", typeof(Felica_free)); - felica_getidm = (Felica_getidm)bdDLL.GetDelegate("felica_getidm", typeof(Felica_getidm)); - felica_getpmm = (Felica_getpmm)bdDLL.GetDelegate("felica_getpmm", typeof(Felica_getpmm)); - felica_read_without_encryption02 = (Felica_read_without_encryption02)bdDLL.GetDelegate("felica_read_without_encryption02", typeof(Felica_read_without_encryption02)); - } - catch (Exception) - { - throw new Exception(szDLLname + " ‚ðƒ[ƒh‚Å‚«‚Ü‚¹‚ñ"); - } - - pasorip = pasori_open(null); - if (pasorip == IntPtr.Zero) - { - throw new Exception(szDLLname + " ‚ðŠJ‚¯‚Ü‚¹‚ñ"); - } - if (pasori_init(pasorip) != 0) - { - throw new Exception("PaSoRi ‚ÉÚ‘±‚Å‚«‚Ü‚¹‚ñ"); - } - } - - #region IDisposable ƒƒ“ƒo - - /// - /// ƒIƒuƒWƒFƒNƒg”jŠüŽžˆ— - /// - public void Dispose() - { - if (pasorip != IntPtr.Zero) - { - pasori_close(pasorip); - pasorip = IntPtr.Zero; - } - if (bdDLL != null) - { - bdDLL = null; - } - } - - #endregion - - /// - /// ƒfƒXƒgƒ‰ƒNƒ^ - /// - ~Felica() - { - Dispose(); - } - - /// - /// ƒ|[ƒŠƒ“ƒO - /// - /// ƒVƒXƒeƒ€ƒR[ƒh - public void Polling(int systemcode) - { - felica_free(felicap); - - felicap = felica_polling(pasorip, (ushort)systemcode, 0, 0); - if (felicap == IntPtr.Zero) - { - throw new Exception("ƒJ[ƒh“Ç‚ÝŽæ‚莸”s"); - } - } - - /// - /// IDmŽæ“¾ - /// - /// IDmƒoƒCƒiƒŠƒf[ƒ^ - public byte[] IDm() - { - if (felicap == IntPtr.Zero) - { - throw new Exception("no polling executed."); - } - - byte[] buf = new byte[8]; - felica_getidm(felicap, buf); - return buf; - } - - /// - /// PMmŽæ“¾ - /// - /// PMmƒoƒCƒiƒŠƒf[ƒ^ - public byte[] PMm() - { - if (felicap == IntPtr.Zero) - { - throw new Exception("no polling executed."); - } - - byte[] buf = new byte[8]; - felica_getpmm(felicap, buf); - return buf; - } - - /// - /// ”ñˆÃ†‰»—̈æ“Ç‚Ýž‚Ý - /// - /// ƒT[ƒrƒXƒR[ƒh - /// ƒAƒhƒŒƒX - /// ƒf[ƒ^ - public byte[] ReadWithoutEncryption(int servicecode, int addr) - { - if (felicap == IntPtr.Zero) - { - throw new Exception("no polling executed."); - } - - byte[] data = new byte[16]; - int ret = felica_read_without_encryption02(felicap, servicecode, 0, (byte)addr, data); - if (ret != 0) - { - return null; - } - return data; - } - } -} diff --git a/src/CSharp/FelicaLib.csproj b/src/CSharp/FelicaLib.csproj deleted file mode 100644 index a0362ac..0000000 --- a/src/CSharp/FelicaLib.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - Debug - AnyCPU - 9.0.21022 - 2.0 - {12FF6866-AE11-419C-8EE0-0915D77A699C} - Exe - Properties - FelicaLib - Nanaco - - - - - - - 2.0 - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/CSharp/Properties/AssemblyInfo.cs b/src/CSharp/Properties/AssemblyInfo.cs deleted file mode 100644 index a45fd78..0000000 --- a/src/CSharp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリã«é–¢ã™ã‚‹ä¸€èˆ¬æƒ…å ±ã¯ä»¥ä¸‹ã®å±žæ€§ã‚»ãƒƒãƒˆã‚’ã¨ãŠã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ -// アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ -// ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 -[assembly: AssemblyTitle("FelicaLib")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("FelicaLib")] -[assembly: AssemblyCopyright("Copyright (C) 2007")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible ã‚’ false ã«è¨­å®šã™ã‚‹ã¨ã€ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内ã®åž‹ã¯ COM コンãƒãƒ¼ãƒãƒ³ãƒˆã«ã¯ -// å‚ç…§ä¸å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚COM ã‹ã‚‰ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内ã®åž‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ã€ -// ãã®åž‹ã® ComVisible 属性を true ã«è¨­å®šã—ã¦ãã ã•ã„。 -[assembly: ComVisible(false)] - -// 次㮠GUID ã¯ã€ã“ã®ãƒ—ロジェクト㌠COM ã«å…¬é–‹ã•ã‚Œã‚‹å ´åˆã®ã€typelib ã® ID ã§ã™ -[assembly: Guid("e4042064-c476-45ee-acbf-bea9d6aa836c")] - -// アセンブリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã¯ã€ä»¥ä¸‹ã® 4 ã¤ã®å€¤ã§æ§‹æˆã•ã‚Œã¦ã„ã¾ã™: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// ã™ã¹ã¦ã®å€¤ã‚’指定ã™ã‚‹ã‹ã€ä¸‹ã®ã‚ˆã†ã« '*' を使ã£ã¦ãƒªãƒ“ジョンãŠã‚ˆã³ãƒ“ルド番å·ã‚’ -// 既定値ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/CSharp/Sample.cs b/src/CSharp/Sample.cs deleted file mode 100644 index 637cc34..0000000 --- a/src/CSharp/Sample.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using FelicaLib; - -namespace FelicaLib -{ - public class Nanaco - { - public static void Main() - { - try - { - using (Felica f = new Felica()) - { - readNanaco(f); - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } - - private static void readNanaco(Felica f) - { - f.Polling((int)SystemCode.Common); - byte[] data = f.ReadWithoutEncryption(0x558b, 0); - if (data == null) - { - throw new Exception("nanaco ID ‚ª“Ç‚ÝŽæ‚ê‚Ü‚¹‚ñ"); - } - Console.Write("Nanaco ID = "); - for (int i = 0; i < 8; i++) { - Console.Write(data[i].ToString("X2")); - } - Console.Write("\n"); - - for (int i = 0; ; i++) - { - data = f.ReadWithoutEncryption(0x564f, i); - if (data == null) break; - - switch (data[0]) - { - case 0x47: - default: - Console.Write("Žx•¥ "); - break; - case 0x6f: - Console.Write("ƒ`ƒƒ[ƒW "); - break; - } - - int value = (data[9] << 24) + (data[10] << 16) + (data[11] << 8) + data[12]; - int year = (value >> 21) + 2000; - int month = (value >> 17) & 0xf; - int date = (value >> 12) & 0x1f; - int hour = (value >> 6) & 0x3f; - int min = value & 0x3f; - - Console.Write("{0}/{1:D2}/{2:D2} {3:D2}:{4:D2}", year, month, date, hour, min); - - value = (data[1] << 24) + (data[2] << 16) + (data[3] << 8) + data[4]; - Console.Write(" ‹àŠz {0,6}‰~", value); - - value = (data[5] << 24) + (data[6] << 16) + (data[7] << 8) + data[8]; - Console.Write(" Žc‚ {0,6}‰~", value); - - value = (data[13] << 8) + data[14]; - Console.WriteLine(" ˜A”Ô {0}", value); - } - } - } -} diff --git a/src/ChangeLog.txt b/src/ChangeLog.txt deleted file mode 100644 index 9816663..0000000 --- a/src/ChangeLog.txt +++ /dev/null @@ -1,43 +0,0 @@ -2010-05-05 : Hirokazu Hayashi - * x64ƒlƒCƒeƒBƒu“®ì‘Ήž - * C#ƒTƒ|[ƒg‚ÌAnyCPU‘Ήž - * ƒTƒ“ƒvƒ‹ƒAƒvƒŠ‚ÌUnicode‘Ήž - -2008-06-01 : Takuya Murakami - * ver 0.4.2 - * FelicaDump.exe ‚ªƒNƒ‰ƒbƒVƒ…‚·‚é–â‘è‚ðC³B - -2008-04-20 : Takuya Murakami - * ver 0.4.1 - * felicalib.dll ‚ª MSVCRT.dll ‚ðŽQÆ‚µ‚Ä‚¢‚½‚½‚ßA - MSVCRT.dll ‚ª‚È‚¢ŠÂ‹«‚Å“®ì‚µ‚È‚©‚Á‚½–â‘è‚ðC³B - -2008-04-19 : Takuya Murakami - * ver 0.4 - * ƒo[ƒWƒ‡ƒ“ƒŠƒ\[ƒX’ljÁ - * ˆê•”ƒ\[ƒX‚̃Cƒ“ƒfƒ“ƒgC³ - -2008-04-15 : Takuya Murakami - * x64 ŠÂ‹«‚Å“®ì‚µ‚È‚¢–â‘è‚ɑΈ - Program Files ƒtƒHƒ‹ƒ_–¼‚ª–„‚ßž‚Ý‚¾‚Á‚½‚½‚ßB - SHGetSpecialFolderPath ‚ðŽg—p‚·‚é‚悤‚ÉC³ - * C# ƒTƒ“ƒvƒ‹‚̃rƒ‹ƒhƒ^[ƒQƒbƒg‚ð Any CPU ‚©‚ç x86 ‚É•ÏX - x64ŠÂ‹«‚Å‚Í Any CPU ‚Å‚Í“®ì‚µ‚È‚¢‚½‚ßB - -2008-03-06 : Takuya Murakami - * Suica/Edy “Ç‚Ýž‚݃Tƒ“ƒvƒ‹‚ð’ljÁ - -2007-11-18 : Takuya Murakami - * ver 0.3 - * ”ñƒZƒLƒ…ƒŠƒeƒBƒGƒŠƒA‘‚«ž‚ݑΉž - -2007-11-10 : Takuya Murakami - * ver 0.2 - * ƒ‰ƒCƒuƒ‰ƒŠ‚ð DLL ‚É•ª—£ - * nanaco.exe ‚ð’ljÁ - * C# ƒTƒ|[ƒg‚ð’ljÁ - -2007-11-05 : Takuya Murakami - * ver 0.1 - * ‰”Å - diff --git a/src/FelicaLib.sln b/src/FelicaLib.sln deleted file mode 100644 index 987264e..0000000 --- a/src/FelicaLib.sln +++ /dev/null @@ -1,66 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FelicaDump", "dump\FelicaDump.vcxproj", "{4FBA68A2-C69E-4B45-86D0-C4409C2D0516}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nanaco", "nanaco\nanaco.vcxproj", "{AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "felicalib", "lib\felicalib.vcxproj", "{6C207D2C-38B7-4C66-B1C6-7A74F59F2583}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "suica", "suica\suica.vcxproj", "{C547D062-D5A6-42CD-AF26-7A24FB814FA1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "edy", "edy\edy.vcxproj", "{9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Debug|Win32.ActiveCfg = Debug|Win32 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Debug|Win32.Build.0 = Debug|Win32 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Debug|x64.ActiveCfg = Debug|x64 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Debug|x64.Build.0 = Debug|x64 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Release|Win32.ActiveCfg = Release|Win32 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Release|Win32.Build.0 = Release|Win32 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Release|x64.ActiveCfg = Release|x64 - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516}.Release|x64.Build.0 = Release|x64 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Debug|Win32.ActiveCfg = Debug|Win32 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Debug|Win32.Build.0 = Debug|Win32 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Debug|x64.ActiveCfg = Debug|x64 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Debug|x64.Build.0 = Debug|x64 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Release|Win32.ActiveCfg = Release|Win32 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Release|Win32.Build.0 = Release|Win32 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Release|x64.ActiveCfg = Release|x64 - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF}.Release|x64.Build.0 = Release|x64 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Debug|Win32.ActiveCfg = Debug|Win32 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Debug|Win32.Build.0 = Debug|Win32 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Debug|x64.ActiveCfg = Debug|x64 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Debug|x64.Build.0 = Debug|x64 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Release|Win32.ActiveCfg = Release|Win32 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Release|Win32.Build.0 = Release|Win32 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Release|x64.ActiveCfg = Release|x64 - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583}.Release|x64.Build.0 = Release|x64 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Debug|Win32.ActiveCfg = Debug|Win32 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Debug|Win32.Build.0 = Debug|Win32 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Debug|x64.ActiveCfg = Debug|x64 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Debug|x64.Build.0 = Debug|x64 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Release|Win32.ActiveCfg = Release|Win32 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Release|Win32.Build.0 = Release|Win32 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Release|x64.ActiveCfg = Release|x64 - {C547D062-D5A6-42CD-AF26-7A24FB814FA1}.Release|x64.Build.0 = Release|x64 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Debug|Win32.ActiveCfg = Debug|Win32 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Debug|Win32.Build.0 = Debug|Win32 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Debug|x64.ActiveCfg = Debug|x64 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Debug|x64.Build.0 = Debug|x64 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Release|Win32.ActiveCfg = Release|Win32 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Release|Win32.Build.0 = Release|Win32 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Release|x64.ActiveCfg = Release|x64 - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/README.txt b/src/README.txt deleted file mode 100644 index 85bfba3..0000000 --- a/src/README.txt +++ /dev/null @@ -1,13 +0,0 @@ -* FeliCa Library - -PaSoRi ‚ðŽg‚Á‚Ä FeliCa ‚ɃAƒNƒZƒX‚·‚邽‚߂̃‰ƒCƒuƒ‰ƒŠ‚Å‚·B - -Ú×‚Í http://felicalib.tmurakam.org ‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B - - -** ƒrƒ‹ƒhŽè‡ - -Visual Studio 2008 —p‚̃vƒƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ð“Y•t‚µ‚Ä‚ ‚è‚Ü‚·B -src\FelicaLib.sln ‚ðŠJ‚¢‚ărƒ‹ƒh‚µ‚Ä‚­‚¾‚³‚¢B - -‚Ü‚½AC# —p‚̃vƒƒWƒFƒNƒg‚Í src\CSharp ‚É‚ ‚è‚Ü‚·B diff --git a/src/doxygen.conf b/src/doxygen.conf deleted file mode 100644 index 5c6b5db..0000000 --- a/src/doxygen.conf +++ /dev/null @@ -1,232 +0,0 @@ -# Doxyfile 1.5.3 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = felicalib -PROJECT_NUMBER = 0.1 -OUTPUT_DIRECTORY = -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = Japanese -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = YES -OPTIMIZE_OUTPUT_JAVA = NO -BUILTIN_STL_SUPPORT = NO -CPP_CLI_SUPPORT = NO -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = YES -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text " -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = . -INPUT_ENCODING = SHIFT_JIS -FILE_PATTERNS = *.h \ - *.c -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = NO -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = NO -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -HTML_DYNAMIC_SECTIONS = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -MSCGEN_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = YES -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/src/dump/FelicaDump.vcproj b/src/dump/FelicaDump.vcproj deleted file mode 100755 index 30b3ab4..0000000 --- a/src/dump/FelicaDump.vcproj +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/dump/FelicaDump.vcxproj b/src/dump/FelicaDump.vcxproj deleted file mode 100644 index 793fa83..0000000 --- a/src/dump/FelicaDump.vcxproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {4FBA68A2-C69E-4B45-86D0-C4409C2D0516} - dump - Win32Proj - - - - Application - Unicode - true - - - Application - Unicode - - - Application - Unicode - true - - - Application - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - false - - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - true - Console - false - - - MachineX86 - - - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - true - Console - true - true - false - - - MachineX86 - - - - - X64 - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - true - Console - false - - - MachineX64 - - - - - X64 - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - true - Console - true - true - false - - - MachineX64 - - - - - - - - {6c207d2c-38b7-4c66-b1c6-7a74f59f2583} - false - - - - - - \ No newline at end of file diff --git a/src/dump/FelicaDump.vcxproj.filters b/src/dump/FelicaDump.vcxproj.filters deleted file mode 100644 index 810ca32..0000000 --- a/src/dump/FelicaDump.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - ソース ファイル - - - \ No newline at end of file diff --git a/src/dump/dump.c b/src/dump/dump.c deleted file mode 100644 index 379dc7a..0000000 --- a/src/dump/dump.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file dump.c - - FeliCa ƒ_ƒ“ƒv -*/ - -#include -#include -#include -#include - -#include "felicalib.h" - -static void printserviceinfo(uint16 s); -static void hexdump(uint8* addr, int n); - -int _tmain(int argc, _TCHAR *argv[]) -{ - pasori* p; - felica *f, *f2; - int i, j, k; - - setlocale(LC_ALL, "Japanese"); - - p = pasori_open(NULL); - if (!p) - { - _ftprintf(stderr, _T("PaSoRi open failed.\n")); - exit(1); - } - pasori_init(p); - - f = felica_polling(p, POLLING_ANY, 0, 0); - if (!f) - { - _ftprintf(stderr, _T("Polling card failed.\n")); - exit(1); - } - _tprintf(_T("# IDm: ")); - hexdump(f->IDm, 8); - _tprintf(_T("\n")); - _tprintf(_T("# PMm: ")); - hexdump(f->PMm, 8); - _tprintf(_T("\n\n")); - felica_free(f); - - f = felica_enum_systemcode(p); - if (!f) - { - exit(1); - } - - for (i = 0; i < f->num_system_code; i++) - { - _tprintf(_T("# System code: %04X\n"), N2HS(f->system_code[i])); - f2 = felica_enum_service(p, N2HS(f->system_code[i])); - if (!f2) - { - _ftprintf(stderr, _T("Enum service failed.\n")); - exit(1); - } - - _tprintf(_T("# Number of area = %d\n"), f2->num_area_code); - for (j = 0; j < f2->num_area_code; j++) - { - _tprintf(_T("# Area: %04X - %04X\n"), f2->area_code[j], f2->end_service_code[j]); - } - - _tprintf(_T("# Number of service code = %d\n"), f2->num_service_code); - for (j = 0; j < f2->num_service_code; j++) - { - uint16 service = f2->service_code[j]; - printserviceinfo(service); - - for (k = 0; k < 255; k++) - { - uint8 data[16]; - - if (felica_read_without_encryption02(f2, service, 0, (uint8)k, data)) - { - break; - } - - _tprintf(_T("%04X:%04X "), service, k); - hexdump(data, 16); - _tprintf(_T("\n")); - } - } - _tprintf(_T("\n")); - felica_free(f2); - } - - felica_free(f); - pasori_close(p); - - return 0; -} - -static void printserviceinfo(uint16 s) -{ - TCHAR* ident; - - switch ((s >> 1) & 0xf) - { - case 0: ident = _T("Area Code"); break; - case 4: ident = _T("Random Access R/W"); break; - case 5: ident = _T("Random Access Read only"); break; - case 6: ident = _T("Cyclic Access R/W"); break; - case 7: ident = _T("Cyclic Access Read only"); break; - case 8: ident = _T("Purse (Direct)"); break; - case 9: ident = _T("Purse (Cashback/decrement)"); break; - case 10: ident = _T("Purse (Decrement)"); break; - case 11: ident = _T("Purse (Read only)"); break; - default: ident = _T("INVALID or UNKOWN"); break; - } - - _tprintf(_T("# Serivce code = %04X : %s"), s, ident); - if ((s & 0x1) == 0) - { - _tprintf(_T(" (Protected)")); - } - _tprintf(_T("\n")); -} - -static void hexdump(uint8* addr, int n) -{ - int i; - for (i = 0; i < n; i++) - { - _tprintf(_T("%02X "), addr[i]); - } -} diff --git a/src/edy/edy.c b/src/edy/edy.c deleted file mode 100644 index 4059a54..0000000 --- a/src/edy/edy.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file edy.c - - edy —š—ðƒ_ƒ“ƒv -*/ - -#include -#include -#include -#include -#include - -#include "felicalib.h" - -static void edy_dump(uint8 *data); -static void analyzeTime(int n, struct tm *t); -static int read4b(uint8 *p); -static int read2b(uint8 *p); - -// ƒT[ƒrƒXƒR[ƒh -#define SERVICE_EDY 0x170f - - -int _tmain(int argc, _TCHAR *argv[]) -{ - pasori *p; - felica *f; - int i; - uint8 data[16]; - - setlocale( LC_ALL, "Japanese"); - - p = pasori_open(NULL); - if (!p) - { - _ftprintf(stderr, _T("PaSoRi open failed.\n")); - exit(1); - } - pasori_init(p); - - f = felica_polling(p, POLLING_EDY, 0, 0); - if (!f) - { - _ftprintf(stderr, _T("Polling card failed.\n")); - exit(1); - } - - _tprintf(_T("IDm: ")); - for (i = 0; i < 8; i++) - { - _tprintf(_T("%02x"), f->IDm[i]); - } - _tprintf(_T("\n")); - - for (i = 0; ; i++) - { - if (felica_read_without_encryption02(f, SERVICE_EDY, 0, (uint8)i, data)) - { - break; - } - edy_dump(data); - } - felica_free(f); - pasori_close(p); - - return 0; -} - -static void edy_dump(uint8 *data) -{ - int proc, time, value, balance, seq, v; - struct tm tt; - - v = read4b(data + 0); - proc = v >> 24; // ˆ— - seq = v & 0xffffff; // ˜A”Ô - time = read4b(data + 4); // Žž - value = read4b(data + 8); // ‹àŠz - balance = read4b(data + 12); // Žc‚ - - // “ú•t/Žž - analyzeTime(time, &tt); - _tprintf(_T("%d/%02d/%02d %02d:%02d:%02d "), - tt.tm_year, tt.tm_mon, tt.tm_mday, - tt.tm_hour, tt.tm_min, tt.tm_sec); - - switch (proc) - { - case 0x02: - _tprintf(_T("ƒ`ƒƒ[ƒW ")); - break; - case 0x20: - _tprintf(_T("Žx•¥‚¢ ")); - break; - case 0x04: - _tprintf(_T("ƒMƒtƒg ")); - break; - default: - _tprintf(_T("???? ")); - break; - } - - _tprintf(_T("‹àŠz:%-5d "), value); - _tprintf(_T("Žc‚:%-5d "), balance); - _tprintf(_T("˜A”Ô:%d\n"), seq); -} - -static void analyzeTime(int n, struct tm *t) -{ - time_t tt; - struct tm *t2; - - // calculate day - memset(t, 0, sizeof(*t)); - t->tm_year = 2000 - 1900; - t->tm_mon = 0; - t->tm_mday = 1; - t->tm_hour = 0; - t->tm_min = 0; - t->tm_sec = 0; - t->tm_isdst = -1; - - tt = mktime(t); - tt += (n >> 17) * 24 * 60 * 60; - - t2 = localtime(&tt); - memcpy(t, t2, sizeof(*t)); - - t->tm_year += 1900; - t->tm_mon += 1; - - // calculate time - n = n & 0x1ffff; - t->tm_sec = n % 60; - n /= 60; - t->tm_min = n % 60; - t->tm_hour = n / 60; -} - -static int read4b(uint8 *p) -{ - int v; - v = (*p++) << 24; - v |= (*p++) << 16; - v |= (*p++) << 8; - v |= *p; - return v; -} - -static int read2b(uint8 *p) -{ - int v; - v = (*p++) << 8; - v |= *p; - return v; -} - - diff --git a/src/edy/edy.vcproj b/src/edy/edy.vcproj deleted file mode 100644 index 44c22dc..0000000 --- a/src/edy/edy.vcproj +++ /dev/null @@ -1,347 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/edy/edy.vcxproj b/src/edy/edy.vcxproj deleted file mode 100644 index ae1a187..0000000 --- a/src/edy/edy.vcxproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9BD1C7B0-88F0-4864-A17F-690CDECDFEB6} - edy - Win32Proj - - - - Application - Unicode - true - - - Application - Unicode - - - Application - Unicode - true - - - Application - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - false - - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - true - Console - MachineX86 - - - - - MaxSpeed - true - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - ProgramDatabase - - - true - Console - true - true - MachineX86 - - - - - X64 - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - true - Console - MachineX64 - - - - - X64 - - - MaxSpeed - true - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - ProgramDatabase - - - true - Console - true - true - MachineX64 - - - - - - - - {6c207d2c-38b7-4c66-b1c6-7a74f59f2583} - false - - - - - - \ No newline at end of file diff --git a/src/edy/edy.vcxproj.filters b/src/edy/edy.vcxproj.filters deleted file mode 100644 index 3dd1272..0000000 --- a/src/edy/edy.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - ソース ファイル - - - \ No newline at end of file diff --git a/src/include/felicalib.h b/src/include/felicalib.h deleted file mode 100644 index f6c331a..0000000 --- a/src/include/felicalib.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file felicalib.h - - ƒƒCƒ“ƒwƒbƒ_ -*/ -/** - @mainpage - - API Žd—l‚ɂ‚¢‚Ä‚ÍA felicalib.h ‚ðŽQÆ‚Ì‚±‚ÆB -*/ -#ifndef _FELICALIB_H -#define _FELICALIB_H - -#include -#include - -typedef unsigned char uint8; -typedef unsigned short int uint16; - -typedef struct strpasori pasori; - -#define MAX_SYSTEM_CODE 8 -#define MAX_AREA_CODE 16 -#define MAX_SERVICE_CODE 256 - -/** - @brief FeliCa ƒnƒ“ƒhƒ‹ - - FeliCa ‚Ìî•ñ‚ðŠi”[‚·‚é\‘¢‘Ì -*/ -typedef struct strfelica { - pasori *p; /**< PaSoRi ƒnƒ“ƒhƒ‹ */ - uint16 systemcode; /**< ƒVƒXƒeƒ€ƒR[ƒh */ - uint8 IDm[8]; /**< IDm */ - uint8 PMm[8]; /**< PMm */ - - /* systemcode */ - uint8 num_system_code; /**< —ñ‹“ƒVƒXƒeƒ€ƒR[ƒh” */ - uint16 system_code[MAX_SYSTEM_CODE]; /**< —ñ‹“ƒVƒXƒeƒ€ƒR[ƒh */ - - /* area/service codes */ - uint8 num_area_code; /**< ƒGƒŠƒAƒR[ƒh” */ - uint16 area_code[MAX_AREA_CODE]; /**< ƒGƒŠƒAƒR[ƒh */ - uint16 end_service_code[MAX_AREA_CODE]; /**< ƒGƒ“ƒhƒT[ƒrƒXƒR[ƒh */ - - uint8 num_service_code; /**< ƒT[ƒrƒXƒR[ƒh” */ - uint16 service_code[MAX_SERVICE_CODE]; /**< ƒT[ƒrƒXƒR[ƒh */ -} felica; - -/* constants */ -/* ƒVƒXƒeƒ€ƒR[ƒh (ƒlƒbƒgƒ[ƒNƒoƒCƒgƒI[ƒ_/ƒrƒbƒNƒGƒ“ƒfƒBƒAƒ“‚Å•\‹L) */ -#define POLLING_ANY 0xffff -#define POLLING_EDY 0xfe00 /**< ƒVƒXƒeƒ€ƒR[ƒh: ‹¤’ʗ̈æ (Edy ‚È‚Ç‚ªŽg—p) */ -#define POLLING_SUICA 0x0003 /**< ƒVƒXƒeƒ€ƒR[ƒh: ƒTƒCƒoƒl—̈æ */ - -/* endian */ -/** ƒoƒCƒgƒI[ƒ_•ÏŠ·(16bit) */ -#define SW2B(x) (((x) >> 8) & 0xff | ((x) << 8) & 0xff00) -/** ƒlƒbƒgƒ[ƒNƒoƒCƒgƒI[ƒ_‚©‚çƒzƒXƒgƒoƒCƒgƒI[ƒ_‚Ö‚Ì•ÏŠ·(16bit) */ -#define N2HS(x) SW2B(x) -/** ƒzƒXƒgƒoƒCƒgƒI[ƒ_‚©‚çƒlƒbƒgƒ[ƒNƒoƒCƒgƒI[ƒ_‚Ö‚Ì•ÏŠ·(16bit) */ -#define H2NS(x) SW2B(x) - -/* APIs */ -#ifdef __cplusplus -extern "C" { -#endif - -pasori *pasori_open(char *); -pasori *pasori_open2(TCHAR *); -void pasori_close(pasori *); - -int pasori_init(pasori *); -felica* felica_polling(pasori *, uint16, uint8, uint8); -void felica_free(felica *f); -void felica_getidm(felica *f, uint8 *buf); -void felica_getpmm(felica *f, uint8 *buf); - -int felica_read_without_encryption02(felica *f, int servicecode, int mode, uint8 addr, uint8 *b); - -int felica_write_without_encryption(felica *f, int servicecode, uint8 addr, uint8 *b); // WARNING! NOT TESTED!! - -felica * felica_enum_systemcode(pasori *p); -felica * felica_enum_service(pasori *p, uint16 systemcode); - -#ifdef __cplusplus -} -#endif - -#endif /* _FELICALIB_H */ - diff --git a/src/lib/felicaint.h b/src/lib/felicaint.h deleted file mode 100644 index bf02975..0000000 --- a/src/lib/felicaint.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file felicaint.h - - “à•”ƒwƒbƒ_ -*/ - -#ifndef _FELICAINT_H -#define _FELICAINT_H - -/** @brief Polling \‘¢‘Ì */ -typedef struct { - uint8* system_code; ///< ƒVƒXƒeƒ€ƒR[ƒh (2byte, ƒlƒbƒgƒ[ƒNƒoƒCƒgƒI[ƒ_) - uint8 time_slot; ///< ƒ^ƒCƒ€ƒXƒƒbƒg (0x00, 0x01, 0x03, 0x07, 0x0f ‚Ì‚¢‚¸‚ê‚©) -} POLLING; - -/** @brief ƒJ[ƒhî•ñ\‘¢‘Ì */ -typedef struct { - uint8* card_idm; ///< ƒJ[ƒh‚Ì IDm (8byte) - uint8* card_pmm; ///< ƒJ[ƒh‚Ì PMm (8byte) -} CARD_INFO; - -/** @brief read_block_without_encryption “ü—Í\‘¢‘Ì */ -typedef struct { - uint8 *card_idm; ///< IDm - uint8 number_of_services; ///< ƒT[ƒrƒXƒR[ƒh” - uint8 *service_code_list; ///< ƒT[ƒrƒXƒR[ƒhƒŠƒXƒg - uint8 number_of_blocks; ///< ƒuƒƒbƒN” - uint8 *block_list; ///< ƒuƒƒbƒNƒŠƒXƒg -} INSTR_READ_BLOCK; - -/** @brief read_block_without_encryption o—Í\‘¢‘Ì */ -typedef struct { - uint8 *status_flag_1; ///< ƒXƒe[ƒ^ƒXƒtƒ‰ƒO1 - uint8 *status_flag_2; ///< ƒXƒe[ƒ^ƒXƒtƒ‰ƒO2 - uint8 *result_number_of_blocks; ///< ƒf[ƒ^ƒuƒƒbƒN” - uint8 *block_data; ///< ƒf[ƒ^ƒuƒƒbƒN -} OUTSTR_READ_BLOCK; - -/** @brief write_block_without_encryption “ü—Í\‘¢‘Ì */ -typedef struct { - uint8 *card_idm; ///< IDm - uint8 number_of_services; ///< ƒT[ƒrƒXƒR[ƒh” - uint8 *service_code_list; ///< ƒT[ƒrƒXƒR[ƒhƒŠƒXƒg - uint8 number_of_blocks; ///< ƒuƒƒbƒN” - uint8 *block_list; ///< ƒuƒƒbƒNƒŠƒXƒg - uint8 *block_data; ///< ‘‚«ž‚݃f[ƒ^(16byte) -} INSTR_WRITE_BLOCK; - -/** @brief read_block_without_encryption o—Í\‘¢‘Ì */ -typedef struct { - uint8 *status_flag_1; - uint8 *status_flag_2; -} OUTSTR_WRITE_BLOCK; - -/** @brief polling_and_request_system_code “ü—Í\‘¢‘Ì */ -typedef struct { - uint8 *card_idm; ///< IDm -} INSTR_REQ_SYSTEM_CODE; - -/** @brief polling_and_request_system_code o—Í\‘¢‘Ì */ -typedef struct { - uint8 number_of_system_codes; ///< ƒVƒXƒeƒ€ƒR[ƒh” - uint8 *system_code_list; ///< ƒVƒXƒeƒ€ƒR[ƒh”z—ñ -} OUTSTR_REQ_SYSTEM_CODE; - -/** @brief polling_and_search_service_code “ü—Í\‘¢‘Ì */ -typedef struct { - int buffer_size_of_area_codes; ///< ƒGƒŠƒAƒR[ƒhƒoƒbƒtƒ@ƒTƒCƒY - int buffer_size_of_service_codes; ///< ƒT[ƒrƒXƒR[ƒhƒoƒbƒtƒ@ƒTƒCƒY - int offset_of_area_service_index; ///< ƒGƒŠƒAƒT[ƒrƒXƒIƒtƒZƒbƒg(?) -} INSTR_SEARCH_SERVICE; - -/** @brief polling_and_search_service_code o—Í\‘¢‘Ì */ -typedef struct { - int num_service_codes; ///< ƒT[ƒrƒXƒR[ƒh” - uint8 *service_code_list; ///< ƒT[ƒrƒXƒR[ƒh”z—ñ - int num_area_codes; ///< ƒGƒŠƒAƒR[ƒh” - uint8 *area_code_list; ///< ƒGƒŠƒAƒR[ƒh”z—ñ - uint8 *end_service_code_list; ///< ƒGƒ“ƒhƒT[ƒrƒXƒR[ƒh”z—ñ -} OUTSTR_SEARCH_SERVICE; - -/* DLL entries */ -typedef BOOL (*initialize_library_t)(void); -typedef BOOL (*dispose_library_t)(void); -typedef BOOL (*open_reader_writer_auto_t)(void); -typedef BOOL (*close_reader_writer_t)(void); -typedef BOOL (*polling_and_get_card_information_t)(POLLING *, unsigned char *, CARD_INFO *); -typedef BOOL (*polling_and_request_system_code_t)(POLLING *, INSTR_REQ_SYSTEM_CODE *, - CARD_INFO *, OUTSTR_REQ_SYSTEM_CODE *); -typedef BOOL (*polling_and_search_service_code_t)(POLLING *, INSTR_SEARCH_SERVICE *, - CARD_INFO *, OUTSTR_SEARCH_SERVICE *); -typedef BOOL (*read_block_without_encryption_t)(INSTR_READ_BLOCK *, OUTSTR_READ_BLOCK *); -typedef BOOL (*write_block_without_encryption_t)(INSTR_WRITE_BLOCK *, OUTSTR_WRITE_BLOCK *); - -/* structures */ -/** - @brief PaSoRi ƒnƒ“ƒhƒ‹ - - felica.dll ‚Ì DLL ƒnƒ“ƒhƒ‹A‚¨‚æ‚Ñ DLL ‚̃Gƒ“ƒgƒŠƒ|ƒCƒ“ƒg‚ð•ÛŽ‚·‚éB -*/ -struct strpasori { - HINSTANCE hInstDLL; ///< DLL ƒnƒ“ƒhƒ‹ - -#define declare_entry(f) f ## _t f - declare_entry(initialize_library); - declare_entry(dispose_library); - declare_entry(open_reader_writer_auto); - declare_entry(close_reader_writer); - declare_entry(polling_and_get_card_information); - declare_entry(polling_and_request_system_code); - declare_entry(polling_and_search_service_code); - declare_entry(read_block_without_encryption); - declare_entry(write_block_without_encryption); -#undef declare_entry -}; - -#endif diff --git a/src/lib/felicalib.c b/src/lib/felicalib.c deleted file mode 100644 index 0c054b7..0000000 --- a/src/lib/felicalib.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file felicalib.c - - felicalib –{‘Ì -*/ - -#include "felicalib.h" -#include "felicaint.h" - -#include -#include -#include - -/** - @brief PaSoRi ‚ðƒI[ƒvƒ“‚·‚é - @param[in] dummy ƒ_ƒ~[ (libpasori ‚Ƃ̌݊·«‚Ì‚½‚ß) - @retval pasori ƒnƒ“ƒhƒ‹ - - felica.dll ‚ðƒ[ƒhA‰Šú‰»‚·‚é -*/ -pasori *pasori_open(char *dummy) -{ - TCHAR cp[_MAX_PATH], dllpath[_MAX_PATH]; - - /* get felica.dll path */ - SHGetSpecialFolderPath(NULL, cp, CSIDL_PROGRAM_FILES_COMMON, FALSE); - _stprintf_s(dllpath, _countof(dllpath), _T("%s\\Sony Shared\\FeliCaLibrary\\felica.dll"), cp); - - return pasori_open2(dllpath); -} - -pasori *pasori_open2(TCHAR *dllpath) -{ - pasori *p; - - /* open felica.dll */ - p = (pasori *)malloc(sizeof(pasori)); - p->hInstDLL = LoadLibrary(dllpath); - if (p->hInstDLL == NULL) { - free(p); - return NULL; - } - - /* resolve function pointers */ -#define resolve_entry(f) p->f = (f ## _t)GetProcAddress(p->hInstDLL, #f) - resolve_entry(initialize_library); - resolve_entry(dispose_library); - resolve_entry(open_reader_writer_auto); - resolve_entry(close_reader_writer); - resolve_entry(polling_and_get_card_information); - resolve_entry(polling_and_request_system_code); - resolve_entry(polling_and_search_service_code); - resolve_entry(read_block_without_encryption); - resolve_entry(write_block_without_encryption); - - if (!p->initialize_library()) { - free(p); - return NULL; - } - return p; -} - -/** - @brief PaSoRi ƒnƒ“ƒhƒ‹‚ðƒNƒ[ƒY‚·‚é - @param[in] p pasoriƒnƒ“ƒhƒ‹ - - felica.dll ‚ð‰ð•ú‚·‚é -*/ -void pasori_close(pasori *p) -{ - p->dispose_library(); - FreeLibrary(p->hInstDLL); -} - -/** - @brief PaSoRi ‚ð‰Šú‰»‚·‚é - @param[in] p pasoriƒnƒ“ƒhƒ‹ - @return ƒGƒ‰[ƒR[ƒh -*/ -int pasori_init(pasori *p) -{ - if (!p->open_reader_writer_auto()) { - return -1; - } - return 0; -} - -static felica *alloc_felica(pasori *p, uint16 systemcode) -{ - felica *f = (felica *)malloc(sizeof(felica)); - memset(f, 0, sizeof(felica)); - f->p = p; - f->systemcode = H2NS(systemcode); - - return f; -} - -/** - @brief FeliCa ‚ðƒ|[ƒŠƒ“ƒO‚·‚é - @param[in] p pasoriƒnƒ“ƒhƒ‹ - @param[in] systemcode ƒVƒXƒeƒ€ƒR[ƒh - @param[in] RFU RFU (Žg—p‚µ‚È‚¢) - @param[in] timeslot ƒ^ƒCƒ€ƒXƒƒbƒg - @return felicaƒnƒ“ƒhƒ‹ -*/ -felica *felica_polling(pasori *p, uint16 systemcode, uint8 RFU, uint8 timeslot) -{ - felica *f; - POLLING polling; - uint16 sc; - uint8 number_of_cards = 0; - CARD_INFO card_info; - - f = alloc_felica(p, systemcode); - - sc = H2NS(systemcode); - polling.system_code = (uint8 *)≻ - polling.time_slot = timeslot; - - card_info.card_idm = f->IDm; - card_info.card_pmm = f->PMm; - - if (!p->polling_and_get_card_information(&polling, &number_of_cards, &card_info) || - number_of_cards == 0) { - free(f); - return NULL; - } - - return f; -} - -/** - @brief ˆÃ†‰»‚³‚ê‚Ä‚¢‚È‚¢ƒuƒƒbƒN‚ð“Ç‚Ýž‚Þ - @param[in] f felicaƒnƒ“ƒhƒ‹ - @param[in] servicecode ƒT[ƒrƒXƒR[ƒh - @param[in] mode ƒ‚[ƒh(Žg—p‚µ‚È‚¢) - @param[in] addr ƒuƒƒbƒN”Ô† - @param[out] data ƒf[ƒ^(16ƒoƒCƒg) - @return ƒGƒ‰[ƒR[ƒh - - ƒT[ƒrƒXƒR[ƒhAƒuƒƒbƒN”Ô†‚ðŽw’肵‚ăuƒƒbƒN‚ð“Ç‚Ýž‚ÞB - ƒVƒXƒeƒ€ƒR[ƒh‚Í felica_polling ‚ÅŽw’肵‚½‚à‚Ì‚ªŽg—p‚³‚ê‚éB -*/ -int felica_read_without_encryption02(felica *f, int servicecode, int mode, uint8 addr, uint8 *data) -{ - INSTR_READ_BLOCK irb; - OUTSTR_READ_BLOCK orb; - - uint8 service_code_list[2]; - uint8 block_list[2]; - uint8 status_flag1, status_flag2; - uint8 result_number_of_blocks = 0; - - service_code_list[0] = servicecode & 0xff; - service_code_list[1] = servicecode >> 8; - block_list[0] = 0x80; - block_list[1] = addr; - - irb.card_idm = f->IDm; - irb.number_of_services = 1; - irb.service_code_list = service_code_list; - irb.number_of_blocks = 1; - irb.block_list = block_list; - - orb.status_flag_1 = &status_flag1; - orb.status_flag_2 = &status_flag2; - orb.result_number_of_blocks = &result_number_of_blocks; - orb.block_data = data; - - if (!f->p->read_block_without_encryption(&irb, &orb)) { - return -1; - } - if (status_flag1 != 0) { - return -1; - } - return 0; -} - -/*------------- ‚±‚±‚©‚ç‚Í libpasori ŒÝŠ·‚Å‚È‚¢ (“ÆŽ©) ------------*/ - -/** - @brief ˆÃ†‰»‚³‚ê‚Ä‚¢‚È‚¢ƒuƒƒbƒN‚ð‘‚«ž‚Þ - @param[in] f felicaƒnƒ“ƒhƒ‹ - @param[in] servicecode ƒT[ƒrƒXƒR[ƒh - @param[in] mode ƒ‚[ƒh(Žg—p‚µ‚È‚¢) - @param[in] addr ƒuƒƒbƒN”Ô† - @param[out] data ƒf[ƒ^(16ƒoƒCƒg) - @return ƒGƒ‰[ƒR[ƒh - - ƒT[ƒrƒXƒR[ƒhAƒuƒƒbƒN”Ô†‚ðŽw’肵‚ăuƒƒbƒN‚ð“Ç‚Ýž‚ÞB - ƒVƒXƒeƒ€ƒR[ƒh‚Í felica_polling ‚ÅŽw’肵‚½‚à‚Ì‚ªŽg—p‚³‚ê‚éB - ’ˆÓ!!! –{ŠÖ”‚Í–¢ƒeƒXƒg!!!!! -*/ -int felica_write_without_encryption(felica *f, int servicecode, uint8 addr, uint8 *data) -{ - INSTR_WRITE_BLOCK irb; - OUTSTR_WRITE_BLOCK orb; - - uint8 service_code_list[2]; - uint8 block_list[2]; - uint8 status_flag1, status_flag2; - - service_code_list[0] = servicecode & 0xff; - service_code_list[1] = servicecode >> 8; - block_list[0] = 0x80; - block_list[1] = addr; - - irb.card_idm = f->IDm; - irb.number_of_services = 1; - irb.service_code_list = service_code_list; - irb.number_of_blocks = 1; - irb.block_list = block_list; - irb.block_data = data; - - orb.status_flag_1 = &status_flag1; - orb.status_flag_2 = &status_flag2; - - if (!f->p->write_block_without_encryption(&irb, &orb)) { - return -1; - } - if (status_flag1 != 0) { - return -1; - } - return 0; -} - -/** - @brief felica ƒnƒ“ƒhƒ‹‰ð•ú - @param[in] f felica ƒnƒ“ƒhƒ‹ -*/ -void felica_free(felica *f) -{ - free(f); -} - -/** - @brief IDm Žæ“¾ - @param[in] f felica ƒnƒ“ƒhƒ‹ - @param[out] buf IDm ‚ðŠi”[‚·‚éƒoƒbƒtƒ@(8ƒoƒCƒg) -*/ -void felica_getidm(felica *f, uint8 *buf) -{ - memcpy(buf, f->IDm, 8); -} - -/** - @brief PMm Žæ“¾ - @param[in] f felica ƒnƒ“ƒhƒ‹ - @param[out] buf PMm ‚ðŠi”[‚·‚éƒoƒbƒtƒ@(8ƒoƒCƒg) -*/ -void felica_getpmm(felica *f, uint8 *buf) -{ - memcpy(buf, f->PMm, 8); -} - -/** - @brief ƒVƒXƒeƒ€ƒR[ƒh‚Ì—ñ‹“ - @param[in] p pasoriƒnƒ“ƒhƒ‹ - @return felicaƒnƒ“ƒhƒ‹ - - Œ‹‰Ê‚ÍAfelica\‘¢‘Ì‚Ì num_system_code/system_code ‚ÉŠi”[‚³‚ê‚éB - ‚È‚¨AƒVƒXƒeƒ€ƒR[ƒh‚̃Gƒ“ƒfƒBƒAƒ“‚Í‹t‚ÉŠi”[‚³‚ê‚Ä‚¢‚é‚Ì‚Å’ˆÓ‚·‚邱‚ÆB -*/ -felica * felica_enum_systemcode(pasori *p) -{ - felica *f; - POLLING polling; - CARD_INFO card_info; - INSTR_REQ_SYSTEM_CODE irs; - OUTSTR_REQ_SYSTEM_CODE ors; - - f = alloc_felica(p, POLLING_ANY); - - polling.system_code = (uint8 *)&f->systemcode; - polling.time_slot = 0; - - card_info.card_idm = f->IDm; - card_info.card_pmm = f->PMm; - - irs.card_idm = f->IDm; - - ors.system_code_list = (uint8 *)f->system_code; - - if (!f->p->polling_and_request_system_code(&polling, &irs, &card_info, &ors)) { - free(f); - return NULL; - } - - f->num_system_code = ors.number_of_system_codes; - return f; -} - -/** - @brief ƒT[ƒrƒX/ƒGƒŠƒAƒR[ƒh‚Ì—ñ‹“ - @param[in] p pasoriƒnƒ“ƒhƒ‹ - @param[in] systemcode ƒVƒXƒeƒ€ƒR[ƒh - @return felicaƒnƒ“ƒhƒ‹ - - Œ‹‰Ê‚ÍAfelica\‘¢‘Ì‚Ì num_area_code/area_code/end_service_code ‚¨‚æ‚Ñ - num_service_code/service_code ‚ÉŠi”[‚³‚ê‚éB -*/ -felica * felica_enum_service(pasori *p, uint16 systemcode) -{ - felica *f; - - POLLING polling; - CARD_INFO card_info; - INSTR_SEARCH_SERVICE iss; - OUTSTR_SEARCH_SERVICE oss; - - f = alloc_felica(p, systemcode); - - polling.system_code = (uint8 *)&f->systemcode; - polling.time_slot = 0; - - card_info.card_idm = f->IDm; - card_info.card_pmm = f->PMm; - - iss.buffer_size_of_area_codes = MAX_AREA_CODE; - iss.buffer_size_of_service_codes = MAX_SERVICE_CODE; - iss.offset_of_area_service_index = 0; - - oss.num_area_codes = 10; - oss.num_service_codes = 10; - oss.service_code_list = (uint8 *)f->service_code; - oss.area_code_list = (uint8 *)f->area_code; - oss.end_service_code_list = (uint8 *)f->end_service_code; - - if (!f->p->polling_and_search_service_code(&polling, &iss, &card_info, &oss)) { - free(f); - return NULL; - } - - f->num_area_code = oss.num_area_codes; - f->num_service_code = oss.num_service_codes; - - return f; -} diff --git a/src/lib/felicalib.def b/src/lib/felicalib.def deleted file mode 100644 index b7b717e..0000000 --- a/src/lib/felicalib.def +++ /dev/null @@ -1,15 +0,0 @@ -LIBRARY "felicalib" - -EXPORTS - pasori_open - pasori_open2 - pasori_close - pasori_init - felica_polling - felica_getidm - felica_getpmm - felica_free - felica_read_without_encryption02 - felica_write_without_encryption - felica_enum_service - felica_enum_systemcode diff --git a/src/lib/felicalib.rc b/src/lib/felicalib.rc deleted file mode 100644 index 1edbdf0..0000000 --- a/src/lib/felicalib.rc +++ /dev/null @@ -1,103 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// “ú–{Œê resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) -#ifdef _WIN32 -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT -#pragma code_page(932) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,3,1 - PRODUCTVERSION 0,4,3,1 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "041104b0" - BEGIN - VALUE "Comments", "FeliCa Access Library" - VALUE "CompanyName", "tmurakam.org" - VALUE "FileDescription", "felicalib dynamic link library" - VALUE "FileVersion", "0, 4, 3, 1" - VALUE "InternalName", "felicalib" - VALUE "LegalCopyright", "Copyright (C) 2007-2008, Takuya Murakami" - VALUE "OriginalFilename", "felicalib.dll" - VALUE "ProductName", "felicalib" - VALUE "ProductVersion", "0, 4, 3, 1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x411, 1200 - END -END - -#endif // “ú–{Œê resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/lib/felicalib.vcproj b/src/lib/felicalib.vcproj deleted file mode 100755 index 748edbf..0000000 --- a/src/lib/felicalib.vcproj +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/lib/felicalib.vcxproj b/src/lib/felicalib.vcxproj deleted file mode 100644 index 020a996..0000000 --- a/src/lib/felicalib.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {6C207D2C-38B7-4C66-B1C6-7A74F59F2583} - lib - Win32Proj - - - - DynamicLibrary - Unicode - true - - - DynamicLibrary - Unicode - - - DynamicLibrary - Unicode - true - - - DynamicLibrary - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - - - felicalib.def - true - false - - - - - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - - - felicalib.def - false - - - - - - - X64 - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - $(OutDir)$(ProjectName)64.dll - - - felicalib64.def - true - false - - - MachineX64 - - - - - X64 - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - $(OutDir)$(ProjectName)64.dll - - - felicalib64.def - false - - - MachineX64 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/lib/felicalib.vcxproj.filters b/src/lib/felicalib.vcxproj.filters deleted file mode 100644 index 2f48b0b..0000000 --- a/src/lib/felicalib.vcxproj.filters +++ /dev/null @@ -1,46 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - ソース ファイル - - - - - ヘッダー ファイル - - - ヘッダー ファイル - - - ヘッダー ファイル - - - - - リソース ファイル - - - リソース ファイル - - - - - リソース ファイル - - - \ No newline at end of file diff --git a/src/lib/felicalib64.def b/src/lib/felicalib64.def deleted file mode 100644 index 351101d..0000000 --- a/src/lib/felicalib64.def +++ /dev/null @@ -1,15 +0,0 @@ -LIBRARY "felicalib64" - -EXPORTS - pasori_open - pasori_open2 - pasori_close - pasori_init - felica_polling - felica_getidm - felica_getpmm - felica_free - felica_read_without_encryption02 - felica_write_without_encryption - felica_enum_service - felica_enum_systemcode diff --git a/src/lib/resource.h b/src/lib/resource.h deleted file mode 100644 index bb0df91..0000000 --- a/src/lib/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by felicalib.rc - -// V‚µ‚¢ƒIƒuƒWƒFƒNƒg‚ÌŽŸ‚ÌŠù’è’l -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/nanaco/nanaco.c b/src/nanaco/nanaco.c deleted file mode 100644 index ede568e..0000000 --- a/src/nanaco/nanaco.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file nanaco.c - - nanaco ƒ_ƒ“ƒv -*/ - -#include -#include -#include -#include - -#include "felicalib.h" - -static void nanaco_dump(uint8 *data); -static int read4b(uint8 *p); -static int read2b(uint8 *p); - -int _tmain(int argc, _TCHAR *argv[]) -{ - pasori *p; - felica *f; - int i; - uint8 data[16]; - - setlocale( LC_ALL, "Japanese"); - - p = pasori_open(NULL); - if (!p) { - _ftprintf(stderr, _T("PaSoRi open failed.\n")); - exit(1); - } - pasori_init(p); - - f = felica_polling(p, 0xfe00, 0, 0); - if (!f) { - _ftprintf(stderr, _T("Polling card failed.\n")); - exit(1); - } - - if (felica_read_without_encryption02(f, 0x558b, 0, 0, data)) { - _ftprintf(stderr, _T("Can't read nanaco ID.\n")); - exit(1); - } - - _tprintf(_T("nanaco id: ")); - for (i = 0; i < 8; i++) { - _tprintf(_T("%02x"), data[i]); - } - _tprintf(_T("\n")); - - for (i = 0; ; i++) { - if (felica_read_without_encryption02(f, 0x564f, 0, (uint8)i, data)) { - break; - } - nanaco_dump(data); - } - felica_free(f); - pasori_close(p); - - return 0; -} - -static void nanaco_dump(uint8 *data) -{ - int value, yy, mm, dd, hh, min; - - switch (data[0]) { - case 0x47: - _tprintf(_T("Žx•¥ ")); - break; - case 0x6f: - _tprintf(_T("ƒ`ƒƒ[ƒW ")); - break; - default: - _tprintf(_T("•s–¾ ")); - break; - } - - value = read4b(data + 1); - _tprintf(_T("‹àŠz:%-6d‰~ "), value); - - value = read4b(data + 5); - _tprintf(_T("Žc‚:%-6d‰~ "), value); - - value = read4b(data + 9); - yy = value >> 21; - mm = (value >> 17) & 0xf; - dd = (value >> 12) & 0x1f; - hh = (value >> 6) & 0x3f; - min = value & 0x3f; - _tprintf(_T("%02d/%02d/%02d %02d:%02d "), yy, mm, dd, hh, min); - - value = read2b(data + 13); - _tprintf(_T("˜A”Ô: %d\n"), value); -} - -static int read4b(uint8 *p) -{ - int v; - v = (*p++) << 24; - v |= (*p++) << 16; - v |= (*p++) << 8; - v |= *p; - return v; -} - -static int read2b(uint8 *p) -{ - int v; - v = (*p++) << 8; - v |= *p; - return v; -} diff --git a/src/nanaco/nanaco.vcproj b/src/nanaco/nanaco.vcproj deleted file mode 100755 index 9e035c4..0000000 --- a/src/nanaco/nanaco.vcproj +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/nanaco/nanaco.vcxproj b/src/nanaco/nanaco.vcxproj deleted file mode 100644 index 448b348..0000000 --- a/src/nanaco/nanaco.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {AD192DAF-D89C-41D8-950C-1B6DBC4D4EFF} - nanaco - Win32Proj - - - - Application - Unicode - true - - - Application - Unicode - - - Application - Unicode - true - - - Application - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - false - - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - true - Console - false - - - MachineX86 - - - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - true - Console - true - true - false - - - MachineX86 - - - - - X64 - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - true - Console - false - - - MachineX64 - - - - - X64 - - - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - - - Level3 - ProgramDatabase - - - true - Console - true - true - false - - - MachineX64 - - - - - {6c207d2c-38b7-4c66-b1c6-7a74f59f2583} - true - true - - - - - - - - - \ No newline at end of file diff --git a/src/nanaco/nanaco.vcxproj.filters b/src/nanaco/nanaco.vcxproj.filters deleted file mode 100644 index 05b41c6..0000000 --- a/src/nanaco/nanaco.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - ソース ファイル - - - \ No newline at end of file diff --git a/src/suica/suica.c b/src/suica/suica.c deleted file mode 100644 index 4d7a84a..0000000 --- a/src/suica/suica.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file suica.c - - suica —š—ðƒ_ƒ“ƒv (“üoê—š—ð‚Í–¢‘Ήž) -*/ - -#include -#include -#include -#include -#include "felicalib.h" - -static void suica_dump_history(uint8 *data); -static LPCTSTR consoleType(int ctype); -static LPCTSTR procType(int proc); -static int read4b(uint8 *p); -static int read2b(uint8 *p); - -// ƒT[ƒrƒXƒR[ƒh -#define SERVICE_SUICA_INOUT 0x108f -#define SERVICE_SUICA_HISTORY 0x090f - - -int _tmain(int argc, _TCHAR *argv[]) -{ - pasori *p; - felica *f; - int i; - uint8 data[16]; - - setlocale( LC_ALL, "Japanese"); - - p = pasori_open(NULL); - if (!p) { - _ftprintf(stderr, _T("PaSoRi open failed.\n")); - exit(1); - } - pasori_init(p); - - f = felica_polling(p, POLLING_SUICA, 0, 0); - if (!f) { - _ftprintf(stderr, _T("Polling card failed.\n")); - exit(1); - } - - _tprintf(_T("IDm: ")); - for (i = 0; i < 8; i++) { - _tprintf(_T("%02x"), f->IDm[i]); - } - _tprintf(_T("\n")); - - for (i = 0; ; i++) { - if (felica_read_without_encryption02(f, SERVICE_SUICA_HISTORY, 0, (uint8)i, data)) { - break; - } - suica_dump_history(data); - } - - felica_free(f); - pasori_close(p); - - return 0; -} - -static void suica_dump_history(uint8 *data) -{ - int ctype, proc, date, time, balance, seq, region; - int in_line, in_sta, out_line, out_sta; - int yy, mm, dd; - - ctype = data[0]; // ’[––Ží - proc = data[1]; // ˆ— - date = read2b(data + 4); // “ú•t - balance = read2b(data + 10);// Žc‚ - balance = N2HS(balance); - seq = read4b(data + 12); - region = seq & 0xff; // Region - seq >>= 8; // ˜A”Ô - - out_line = -1; - out_sta = -1; - time = -1; - - switch (ctype) { - case 0xC7: // •¨”Ì - case 0xC8: // Ž©”Ì‹@ - time = read2b(data + 6); - in_line = data[8]; - in_sta = data[9]; - break; - - case 0x05: // ŽÔÚ‹@ - in_line = read2b(data + 6); - in_sta = read2b(data + 8); - break; - - default: - in_line = data[6]; - in_sta = data[7]; - out_line = data[8]; - out_sta = data[9]; - break; - } - - _tprintf(_T("’[––Ží:%s "), (LPCTSTR)consoleType(ctype)); - _tprintf(_T("ˆ—:%s "), (LPCTSTR)procType(proc)); - - // “ú•t - yy = date >> 9; - mm = (date >> 5) & 0xf; - dd = date & 0x1f; - _tprintf(_T("%02d/%02d/%02d "), yy, mm, dd); - - // Žž - if (time > 0) { - int hh = time >> 11; - int min = (time >> 5) & 0x3f; - - _tprintf(_T(" %02d:%02d "), hh, min); - } - - _tprintf(_T("“ü:%x/%x "), in_line, in_sta); - if (out_line != -1) { - _tprintf(_T("o:%x/%x "), out_line, out_sta); - } - - _tprintf(_T("Žc‚:%d "), balance); - _tprintf(_T("˜A”Ô:%d\n"), seq); -} - -static LPCTSTR consoleType(int ctype) -{ - switch (ctype) { - case 0x03: return (LPCTSTR)_T("´ŽZ‹@"); - case 0x05: return (LPCTSTR)_T("ŽÔÚ’[––"); - case 0x08: return (LPCTSTR)_T("Œ””„‹@"); - case 0x12: return (LPCTSTR)_T("Œ””„‹@"); - case 0x16: return (LPCTSTR)_T("‰üŽD‹@"); - case 0x17: return (LPCTSTR)_T("ŠÈˆÕ‰üŽD‹@"); - case 0x18: return (LPCTSTR)_T("‘‹Œû’[––"); - case 0x1a: return (LPCTSTR)_T("‰üŽD’[––"); - case 0x1b: return (LPCTSTR)_T("Œg‘Ñ“d˜b"); - case 0x1c: return (LPCTSTR)_T("æŒp´ŽZ‹@"); - case 0x1d: return (LPCTSTR)_T("˜A—‰üŽD‹@"); - case 0xc7: return (LPCTSTR)_T("•¨”Ì"); - case 0xc8: return (LPCTSTR)_T("Ž©”Ì‹@"); - } - return (LPCTSTR)_T("???"); -} - -static LPCTSTR procType(int proc) -{ - switch (proc) { - case 0x01: return (LPCTSTR)_T("‰^’ÀŽx•¥"); - case 0x02: return (LPCTSTR)_T("ƒ`ƒƒ[ƒW"); - case 0x03: return (LPCTSTR)_T("Œ”w"); - case 0x04: return (LPCTSTR)_T("´ŽZ"); - case 0x07: return (LPCTSTR)_T("V‹K"); - case 0x0d: return (LPCTSTR)_T("ƒoƒX"); - case 0x0f: return (LPCTSTR)_T("ƒoƒX"); - case 0x14: return (LPCTSTR)_T("ƒI[ƒgƒ`ƒƒ[ƒW"); - case 0x46: return (LPCTSTR)_T("•¨”Ì"); - case 0x49: return (LPCTSTR)_T("“ü‹à"); - case 0xc6: return (LPCTSTR)_T("•¨”Ì(Œ»‹à•¹—p)"); - } - return (LPCTSTR)_T("???"); -} - -static int read4b(uint8 *p) -{ - int v; - v = (*p++) << 24; - v |= (*p++) << 16; - v |= (*p++) << 8; - v |= *p; - return v; -} - -static int read2b(uint8 *p) -{ - int v; - v = (*p++) << 8; - v |= *p; - return v; -} - - diff --git a/src/suica/suica.vcproj b/src/suica/suica.vcproj deleted file mode 100644 index f6880eb..0000000 --- a/src/suica/suica.vcproj +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/suica/suica.vcxproj b/src/suica/suica.vcxproj deleted file mode 100644 index 2604ce6..0000000 --- a/src/suica/suica.vcxproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {C547D062-D5A6-42CD-AF26-7A24FB814FA1} - suica - Win32Proj - - - - Application - Unicode - true - - - Application - Unicode - - - Application - Unicode - true - - - Application - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - true - $(SolutionDir)$(Configuration)\ - $(Configuration)\ - false - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - true - $(SolutionDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - false - - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - true - Console - MachineX86 - - - - - MaxSpeed - true - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - ProgramDatabase - - - true - Console - true - true - MachineX86 - - - - - X64 - - - Disabled - ..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - true - Console - MachineX64 - - - - - X64 - - - MaxSpeed - true - ..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - ProgramDatabase - - - true - Console - true - true - MachineX64 - - - - - {6c207d2c-38b7-4c66-b1c6-7a74f59f2583} - true - true - - - - - - - - - \ No newline at end of file diff --git a/src/suica/suica.vcxproj.filters b/src/suica/suica.vcxproj.filters deleted file mode 100644 index 066e6b2..0000000 --- a/src/suica/suica.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - - - - ソース ファイル - - - \ No newline at end of file diff --git a/src/testap/testap.c b/src/testap/testap.c deleted file mode 100644 index d6c8308..0000000 --- a/src/testap/testap.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - felicalib - FeliCa access wrapper library - - Copyright (c) 2007, Takuya Murakami, All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** - @file testap.c -*/ - -#include - -#include "felicalib.h" - -static void nanaco_dump(uint8 *data); -static int read4b(uint8 *p); -static int read2b(uint8 *p); - -int _tmain(int argc, _TCHAR *argv[]) -{ - pasori *p; - felica *f; - int i; - uint8 data[16]; - - p = pasori_open(NULL); - if (!p) { - fprintf(stderr, "PaSoRi open failed.\n"); - exit(1); - } - pasori_init(p); - - f = felica_polling(p, 0x80cd, 0, 0); - if (!f) { - fprintf(stderr, "Polling card failed.\n"); - exit(1); - } - - for (i = 0; i < 16; i++) { - data[i] = i; - } - - if (felica_write_without_encryption(f, 0x1009, 0, data)) { - fprintf(stderr, "write failed.\n"); - exit(1); - } - if (felica_read_without_encryption02(f, 0x1009, 0, 0, data)) { - fprintf(stderr, "Can't read.\n"); - exit(1); - } - for (i = 0; i < 16; i++) { - printf("%02x", data[i]); - } - printf("\n"); - return 0; -} - - diff --git a/src/testap/testap.vcproj b/src/testap/testap.vcproj deleted file mode 100644 index 8cf1006..0000000 --- a/src/testap/testap.vcproj +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/Library/AdsenseBanner.lbi b/web/Library/AdsenseBanner.lbi deleted file mode 100644 index 6ada22f..0000000 --- a/web/Library/AdsenseBanner.lbi +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/web/Templates/Main.dwt b/web/Templates/Main.dwt deleted file mode 100644 index 39550cb..0000000 --- a/web/Templates/Main.dwt +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -felicalib - FeliCa Library - - - - - - - -
- - - - - - - - - -
- -
- - -
- - - - -
- - - -
- - - diff --git a/web/document.html b/web/document.html deleted file mode 100644 index ba50c9d..0000000 --- a/web/document.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -felicalib - FeliCa Library : Documents - - - - - - - -
- - - - - - - - - -
-

使ã„æ–¹

-

サンプルã¨ã—㦠FelicaDump.exe を付ã‘ã¦ã‚ã‚Šã¾ã™ (lpdumpã¨åŒã˜ã‚ˆã†ãªã‚‚ã®)。コマンドラインã§å®Ÿè¡Œã™ã‚‹ã¨ã€FeliCa ã®éžã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¨ãƒªã‚¢ã‚’ã™ã¹ã¦èª­ã¿å‡ºã—ã¾ã™ã€‚

-

-本ライブラリをã‚ãªãŸã®ãƒ—ログラムã‹ã‚‰ä½¿ç”¨ã™ã‚‹æ‰‹é †ã«ã¤ã„ã¦ã¯ã€ -Wiki ã®ã€Œãƒ—ログラムã‹ã‚‰ felicalibを利用ã™ã‚‹æ–¹æ³•ã€ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 -

- -

ドキュメント

- - - - - - - - - -

libpasori ã¨ã®äº’æ›æ€§

-

以下㮠API ã¯äº’æ›æ€§ãŒã‚ã‚Šã¾ã™ã€‚

-
    -
  • pasori_open
  • -
  • pasori_close
  • -
  • pasori_init
  • -
  • felica_polling
  • -
  • felica_read_without_encryption02
  • -
-

以下㮠API ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。

-
  • pasori_write
  • -
  • pasori_read
  • -
-

以下㮠API ãŒè¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚

-
    -
  • felica_enum_systemcode
  • -
  • felica_enum_service
  • -
-

詳細ã¯ã‚½ãƒ¼ã‚¹ã‚’見ã¦ãã ã•ã„。

- -
- - -
- - - - -
- - - -
- - - diff --git a/web/download.html b/web/download.html deleted file mode 100644 index 7bca05a..0000000 --- a/web/download.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -felicalib - FeliCa Library : Download - - - - - - - -
- - - - - - - - - -
-

ダウンロード

- -

プロジェクトページã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。

- - - - - - - - - - - -

開発中ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰

-

開発中ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ github ã§ç®¡ç†ã—ã¦ã„ã¾ã™(sourceforge.jp ã«ã‚るソースã¯å¤ã„ã§ã™ï¼‰ã€‚URL 㯠http://github.com/tmurakam/felicalib ã§ã™ã€‚

-

Windows ã§ã‚½ãƒ¼ã‚¹ã‚’å–り出ã™å ´åˆã¯ TortoiseGit ãŒãŠã™ã™ã‚ã§ã™ã€‚

-

 

-
- - -
- - - - -
- - - -
- - - diff --git a/web/index.html b/web/index.html deleted file mode 100644 index fbe32e9..0000000 --- a/web/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -felicalib - FeliCa Library - - - - - - - -
- - - - - - - - - -
-

What's new?

- -
    -
  • 2008/6/1 : felicalib 0.4.2 リリース。FelicaDump.exe ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ãƒã‚°ã‚’修正ã—ã¾ã—ãŸã€‚
  • -
  • 2008/4/20 : felicalib 0.4.1 リリース。MSVCR90.dll ãŒãªã„環境ã§å‹•ä½œã—ãªã„å•é¡Œã‚’修正ã—ã¾ã—ãŸã€‚
  • -
  • 2008/4/19 : felicalib 0.4 リリース。x64 環境ã«å¯¾å¿œã—ã¾ã—ãŸã€‚注æ„事項ã¯ã“ã¡ã‚‰ã€‚
  • -
-

felicalibã¨ã¯ï¼Ÿ

- - -

felicalib ã¯ã€USB接続㮠FeliCa(フェリカ) リーダ -PaSoRi(パソリ) -を使ã£ã¦ã€FeliCa ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®ãƒ©ã‚¤ãƒ–ラリã§ã™ã€‚Suica, Edy, nanaco ãªã©ã®é›»å­ãƒžãƒãƒ¼ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãªã©ã«ä½¿ç”¨ã§ãã¾ã™ã€‚

-

通常ã€PaSoRi を制御ã™ã‚‹ãŸã‚ã«ã¯ SDK for FeliCa を使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ã“ã® SDK ã¯10万円以上ã—ã¾ã™ã—ã€æ³•äººã—ã‹è³¼å…¥ã§ããªã„ãŸã‚ã€å€‹äººã§ã¯æ‰‹ãŒå‡ºã›ã¾ã›ã‚“。

-

ã¾ãŸã€libpasori ã¨ã„ã†ãƒ•ãƒªãƒ¼ã®ãƒ©ã‚¤ãƒ–ラリもã‚ã‚Šã¾ã™ãŒã€Windows ã§ã¯ libusb-win32 をインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚開発者ã¯ã¨ã‚‚ã‹ãã€ä¸€èˆ¬ãƒ¦ãƒ¼ã‚¶ã« libusb-win32 をインストールã•ã›ãªã‘ã‚Œã°ãªã‚‰ãªã„ã®ã§ã€PaSoRi を使ã£ãŸã‚¢ãƒ—リã®é…布ã¯ã¡ã‚‡ã£ã¨æ°—ãŒå¼•ã‘ã¾ã™ã€‚

-

felicalib ã¯å€‹äººé–‹ç™ºè€…ãŒç°¡å˜ã« PaSoRi を使ã£ãŸã‚¢ãƒ—リケーションを開発ã™ã‚‹ãŸã‚ã®ãƒ©ã‚¤ãƒ–ラリã§ã€libusb-win32 ãªã—㧠PaSoRi を制御ã§ãるフリーã®ãƒ©ã‚¤ãƒ–ラリã§ã™ã€‚

-

- - - -

-

特徴

-
    -
  • フリーソフト (BSD ライセンス)
  • -
  • felica.dll をダイレクトã«å©ãã®ã§ã€FeliCaãƒãƒ¼ãƒˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã•ãˆã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚Œã°ã‚ˆã„ (libusb-win32ä¸è¦)
  • -
  • Windows専用 (felica.dll ã‚’å©ãã®ã§)
  • -
  • libpasori API ã®ä¸‹ä½äº’æ›
  • -
  • C言語 API ã®ä»–ã€C# API ã‚‚æä¾›
  • -
-

IDm/PMm ã®èª­ã¿å–ã‚Šã‚„ã€æš—å·åŒ–ã•ã‚Œã¦ã„ãªã„ブロックã®èª­ã¿å‡ºã—ã¨æ›¸ãè¾¼ã¿ã€ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ‰ãƒ»ã‚µãƒ¼ãƒ“スコードã®åˆ—挙ãªã©ãŒå¯èƒ½ã§ã™ã€‚一般的ãªã‚¢ãƒ—リケーションã§ã‚ã‚Œã°å分開発å¯èƒ½ã ã¨æ€ã„ã¾ã™ã€‚

-

ã¾ãŸã€å…¨ãƒ–ロックをダンプã™ã‚‹ãƒ—ログラム(libpasori ã® lpdump 相当) ã‚‚ã‚ã‚Šã¾ã™ã€‚

- -
- - -
- - - - -
- - - -
- - - diff --git a/web/license.html b/web/license.html deleted file mode 100644 index 5441b88..0000000 --- a/web/license.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - -felicalib - FeliCa Library : License - - - - - - - -
- - - - - - - - - -
-

ライセンスãªã©

-

本ライブラリ㯠BSD Licence ã®å…ƒã§è‡ªç”±ã«åˆ©ç”¨å¯èƒ½ã§ã™ã€‚

-

ãªãŠã€æœ¬ãƒ©ã‚¤ãƒ–ラリã®æ­£ç¢ºæ€§ã€å‹•ä½œã«é–¢ã—ã¦ã¯ä¸€åˆ‡ç„¡ä¿è¨¼ã§ã™ã€‚

-

PaSoRi(パソリ)ã€FeliCaã¯æ ªå¼ä¼šç¤¾ã‚½ãƒ‹ãƒ¼ã®ç™»éŒ²å•†æ¨™ã§ã™ã€‚本プロジェクト㯠SONYã¾ãŸã¯FeliCa技術を用ã„ã‚‹ãã®ä»–ä¼æ¥­ã¨ã‚‚ã„ã‹ãªã‚‹é–¢ä¿‚ã‚‚ã‚ã‚Šã¾ã›ã‚“。

- - - - - - -
- - -
- - - - -
- - - -
- - - diff --git a/web/links.html b/web/links.html deleted file mode 100644 index e252565..0000000 --- a/web/links.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - -felicalib - FeliCa Library : links - - - - - - - -
- - - - - - - - - -
- -

å‚考文献

-

本ライブラリã¯ä»¥ä¸‹ã®æƒ…報をå‚考ã«ä½œæˆã—ã¾ã—ãŸã€‚

- -

ãªãŠã€ä½œè€…㯠SDK for FeliCa ã¯æ‰€æŒã—ã¦ãŠã‚Šã¾ã›ã‚“ã—ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚‚見ãŸã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。本ライブラリã¯ä¸Šè¨˜ã®æƒ…å ±ã®ã¿( + 多少ã®æƒ³åƒåŠ› + 多少ã®å®Ÿé¨“)を使用ã—ã¦ä½œæˆã—ã¾ã—ãŸã€‚ã‚‚ã¡ã‚ã‚“ã€felica.dll ã®ãƒªãƒãƒ¼ã‚¹ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ãƒªãƒ³ã‚°ã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。

- - - - - - - - -

リンク

- - -
- - -
- - - - -
- - - -
- - - diff --git a/web/requirement.html b/web/requirement.html deleted file mode 100644 index 2ad3f49..0000000 --- a/web/requirement.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - -felicalib - FeliCa Library : Requirements - - - - - - - -
- - - - - - - - - -
-

å¿…è¦ç’°å¢ƒ

- -

開発ã«å¿…è¦ãªç’°å¢ƒã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚

- -

 

-

- - - -

- -

FeliCaãƒãƒ¼ãƒˆ/パソリ㯠RC-S330, RC-S320シリーズã€RC-S310/J1C, RC-S310/ED4C ãŒä½¿ãˆã‚‹ã¯ãšã§ã™ã€‚推奨㯠RC-S330ã§ã™ã€‚

- -

開発言語ã¨ã—ã¦ã¯ã€C/C++ ãŠã‚ˆã³ C# ãŒä½¿ãˆã¾ã™ã€‚開発環境ã¨ã—ã¦ã¯ Visual Studio 2008 を推奨。個人的ã«ã¯ Standard Edition ã‚’ãŠå‹§ã‚ã—ã¾ã™ãŒã€Express Edition ã§ã‚‚動作ã™ã‚‹ã¨æ€ã„ã¾ã™(Platform SDK ãªã©ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯åˆ¥é€”å¿…è¦)。

-

x64 環境ã§ã®æ³¨æ„事項ã¯ã“ã¡ã‚‰ã€‚

- - - - - -
- - -
- - - - -
- - - -
- - - diff --git a/web/style.css b/web/style.css deleted file mode 100644 index 9d68d50..0000000 --- a/web/style.css +++ /dev/null @@ -1,134 +0,0 @@ -a -{ - text-decoration:none; -} -a:link -{ - /*color: rgb(51,153,255);*/ - text-decoration:none; -} -a:hover -{ - color:red; - text-decoration:underline; -} -a:visited -{ - color: rgb(51,102,204); -} - -a:active -{ - color: rgb(255,153,0); -} - -body -{ - text-align: center; - background-color: #F0F9FF; - font-size: 90%; -} - - -#contents { - width: 900px; - margin: auto; - background-color: #FFFFFF; - text-align: left; - border: solid 1px #CCCCCC; -} - -#header { - width: 900px; - padding-bottom: 10px; -} - -#menubar { - float: left; - width: 120px; - padding-left: 0px; - padding-bottom: 0px; -} - -.menuentry { - font-size: 100%; - border: 1px solid #CCCCCC; - border-left: 12px solid #B2CDEC; - padding: 3px; - margin: 3px; - margin-left: 1px; - background-color: #FFFFFF; -} - -#main { - float: left; - width: 580px; - padding-left: 20px; - padding-bottom: 20px; -} - -#ads { - width: 180px; - float: left; - padding-left: 0px; - padding-right: 0px; - text-align: right; -} - -#footer { - width: 900px; - clear: both; - border-top: solid 1px #cccccc; - padding: 8px; - text-align: center; - font-size: 80%; -} - -h1 -{ - font-size: 230%; - color: #A000A0; - background-color: #ececec; - border-left: 16px solid #000080; - /*border-top: 2px solid #000080;*/ - padding-left: 10px; - padding-top: 3px; - padding-bottom: 3px; -} -h2 -{ - font-size: 160%; - color: #408080; - background-color: #ececec; - border-left: 6px solid #000080; - border-top: 1px solid #000080; - padding-left: 10px; - padding-top: 3px; - padding-bottom: 3px; -} -h3 -{ - font-size: 110%; - color: #008000; - background-color: #ececec; - border-left: 5px solid #006000; - /*border-top: 1px solid #006000;*/ - padding-left: 10px; - padding-top: 2px; - padding-bottom: 2px; -} -h4 -{ - color: rgb(153,153,0); -} -h5 -{ - color: rgb(255,153,0); -} -h6 -{ - color: rgb(51,102,204); -} -p { - padding-left: 5px; -} diff --git a/web/title.jpg b/web/title.jpg deleted file mode 100644 index 237fa8f508ebf4382001a494dde870f0e9d1962d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9764 zcmdUVcT|&0*YATMdJs@VRElt!x!-r!d)K=EoppCs)-!8n&z{WA?DFj29QPlO0~f#` zZ4f|5M+ZEleSqU3KoekOU|=}Sz^$7u+&sVkO(#O=&YU^J!pw5@!iB3`9Bdq1e-Hk@HjcjlY-a%r`Zx4+ zY``ftI(jy`<3@l708X8vr=tV@H=UwCL&v~)_B3tu{srI^9sQ|Or_V4kFfh`e@X(#2 zXJ9*hk@5N&cFB8&{8F}_FJntDNz2H}8F_hs{wkp1^O55T@z-TR&A75}_p>HwQn={= zdfLz&P=$@|L?-=N#@|k#Xzjn2IL*d*@w%kcJwuxOuk8HNG9ODXUDh!2 ziX~3`;t=qD^-XZ?$?+h-OixGK3q2d44s6o2{ck!2@y|I_36;J25(F^b1(;97astc% zz$E2d-Dk2YKSZQ#Y3{^!-pSr4e9=o$>d2lUlRF4*JCH|5$q!5;^b`Em6Jw}_xU+tqH6AzRc* zKQiv&Q;?D239kUxL)y&j1Vrrj?AR#bf%~RXpjPd_Sdqx*PeC$q57;=hwXT0XndBrO z9Krt%;e_-O5wzo%iWlzhHl?kCp@|m`z3}fn{*UKo{<>fP-M_ooEY-CALtXC3F=)~> zuK?U(Xa?^5Ya9G^Utcc}cNeBQGuWvQLW=K6rOft@&MJ%D)ARE$FSPj4wHF_-T_p)m8$E2kZ-0ZP+d|qZV48SC z+8^{Eh>l`Bz4|Hi?-5ySZTqPkj9(&RLjgM4iJ+&Q4Q9ZYAh0%yH8v~BUf7&-adZ+d zF3iVq_M~i-33dIp{&n!_0Hg|cMJ#HuU`OHksytr)#t3_jo{EA`m3+RnQGU$~6S>;bs3lP-^D>_K6mB6ELYCQg zz1?qZRt~!fE%Xu9&sY++Q?}@GA}(!4it7auIlR1@32yGsO8VS{hm&(raXyPqK7lQ; zkpwYrN+e2N-z(VO3E#%DZXW-9ZO(TA&4!U=J1T$Ze9*nk-8V zV!`=nujTDWi`LnqB6lPy#vJ68drP4$@d>F#02XVJQ?mzQldMsxW4RINTX4%ow_Ts= z<&S5LsaoGcI1eqF!HO3ldDVEce9@>|zPCG)D_?b7rsVqaXIx`Lvvye(&v3Zwl3Q|M z(8>yOfMi}x2mPPA3|{~S0N^i;<-8viC1ih5j&?xqe;|p*WJkG}mruSRR@7JFvht0C ztwhV-c=f%p(1Idum&uM6`4Q=kAAij5yho09r{oAcT<{qdYx>nAVu(YgEq+V0Q`DZp z3xy3SrXF?YEu-`tZW2kVvForm`Igj=18|Dl%|U53fCg>!@?cz0;k#dEX;!NTRn; zRn~y>aHRT0B>ZObyxEA5b3hbkGtE^T3vD*Zp3XNxvIo{|mHQ~FrikVg%|}f2%x%0U zlT6&&TNu(rnpP^9E<+ZiQyKGY^IsliT|N-MIqib$33LkpYXK8$s`t< zzY?T*E2(Ijozi@jJvSGaCK8FZ7kqo+)Za$)-y6IYYWn+U|L&nT%JEa#2?hO5^N@6i zeVfn=!H&a^uZ~6c`~O!fvaGwuQtgZo)EcD1l~(FJ zy$T#Tr5pUZ{hewD##gR=>d84WvtXJ;Hz^s#8OQ%J3>x@CeofGIk%6#{NMspDm6|MY zkfg`XwS?_Rb%78Nq1kLgOM0pqn1R$&k$zJ*r@;A&PtlWu(Mo5<&6^$j%)K7l;@(^Mgt;-81 zKW)>B5+*8UwkKCeq2AbB>s9rQ;xrNV-z+m4^qgqYFw=DRX8M zvon>Msai2{H4}`-z$6oI!`ICHt~YYrsw;I;)ZiGR$X=AR$LmK`q&#!5#oGWms^C_B zAJX<(SE+-)xzr%e${52Yt%{I$Gt_mlY}9hD!h9Wsqp>xVbJg-P6Y3&A(;VWd%g_Ca zEYX?l*XA5HtI<7488gYYnt7FP)ft{VeNHF4vif`}uX-D{FhsPf5dEQ{w*6`z2l2*8 zO5gGmH@@#;(x^F67pov*vUm(MIk~NYT|-82XKMEJZ?5Px970*PC$^r$^yL4*^gS9e z!eh4cwY391{8t8whZjtA4O|ACH?Ig-INVU?2Hns&vF;tzfmMT?ln1^iPa`{MUL;>T zV2Y<~z=bZL4s1VJ6H}&j`wvoX%fU5Ms9k}P!NJg{Mx(g~ol$^W*+2}hCjI>~csW#d-H(qxNV(k*z;+2~6 zE^(h=aYGCp104A~nT^x#`xf<=4o0F%?6f9g;^tNu)Fdu;fqj%x+fpux>PtK+Qn*(! zKTOOR!6tY=am2r>sa(jkc%nRvI`0vzB;UFh^@xm-PwHg(YklUS6vr4b;zCwIu(eh| zB0uWobJ0GGLE)_sQJcI4FMU_56&K|>((rVZX`#p(L#~nYg=lVM#>HtTPin`bf-Hru zrLo7NksiqQUr{Q(*$Opby@PH?87rL!AtMORx|f0a&ud9BWhF{{`cWMfO|nLBACYtR zZ!%^R<~PW?Bqf920z?W#qwElz?*wA+gN(GV$8u_en&YHs8HIpw?B_UBDXo)y1#Qpv z=p8qI9 zQV#Is>ZjHp`PFe%DSaAzqI$XB-OuJ4O9KvPBT-q6*4{)eK4{^69pB`*;X6#k=Mah; z&XtuqOq#h&6a?uTklcAa^LY+bd3 zGv*=PE>rE%HpIM+GCnkPq6-_pX(%u24ihEIvVdoe)3s(y^Jl;Y-^9KKMx(DJ4SWSn zYw_l7cvY!X9?2E$W?b{0CY9)C#Vv~Hdjv1_kjlv}&F@Hrs`SKMeU45-7Z&Z3GRA5n z+Dl5fbue>f*2FqtKQ(5_;c|USgU&I47Oy$z&O7oiQDdJvr{~tq!M`SlZ`#Tojpk!} zf|c#y@M@@T7|YqLD$daM3A=1>PRb?v#I)E<(B};l!{EGbP^aB;|6Q@V3;Xvp`~9Vl zffv8R8XO6I&DJrcdqV1lIc_`#x?@jm53STm(t%~8Ye!|%KV7fX90TPquo;Y#k=1&R zPONPykp}&r0_0GG#={L|l84p%ea-1sedTYpMx$N3b&Ml6_g&9CsOrHMjaW2^TBR=P zAnjI{sl0`}m)(aW1u)aiPqLcu#R0s5WLOl`hLAps_Lz&_ZcUfnw&k6w#9JX)N@hP# zx(?OH)by=~6}m#KO&4Jy9nsb+4k(JO#fE|(F2q!Xl-YupjXEmIveB3v^v0F&`JmpQ z0_1&*&08#{C)OgK6%P?!653iO?$r28N99pWe~wM}wxG_R8THtyl^MXx7-&{~d&0k& zSFB{^qO!E;hY^<}n2=}(fL1vF}fJR#>*urP{OuBLJ>Y`eNeaV~FO zEpp}Kv(C7Nz*V}0=iBi1uAX0G{rGWAwA@j+yHi{^jiaNRzV`tMYP5`Xv&Nft2JUucEWHU)9;$JBtEL_P({OWA>s^g0tk&*|NG| z)z05KM-dx}t_fPdR2AO$dQ|tREY>R?W(3Km_7@39+w&pe3q0HE;~KClfwHmX>?P9S zfiB9bT;4m|^5q1JecdXE>x^*loqrp?s&MDF2WGQB9HIVmqvSx6>}X(V{zf zGb;e|tBTJ8o4eREj(KMi9FB5wb@EE7o|-uZ`mhe-6t{wa+___*<>PbgX7A7Z$!O1R zF|~BH_t|izW8myHP=`16*M`@SK?l0!ht;p}!T(DRG#TKyFK~Ww;V3zEBx5^fGxNsl zXN0jsbce1JA9V0YK&^Wp9GFyTH_$gq%?RIwNf;@%Xo;@oiYxDl1PGeR-OT$xdR)?(ixRg;yrZ?=elHP4R--5RrhD9tC zI0T_`nSWWQJK3{PN%5d`T=Ko91G*e%Ut${nglVF$g4gnzYLYIjU9Bcvf>navoh|1W z(2Sf=aZNDZbrzinEJC{f9GL)P`09HiLLm;DG1M^p_{hITZeXo;c%_{}v%?xWt4 zCUto`mww`o-88=M@%2YOxXq~W>9);lY7g46gm%Z;y}&dS;~{!Gh=td2RrVNA;y%EQ zJX_hYzEtO|hNc(9!V}a!l^*27(U>2K6@K`%)l35~d?jhoS!o?}P}*pS?r_s|+G8u-msO;S9B@WgJVbr@q@h~f0l5Du70 z{Kp*8>4x<bbO}$t)qVzGT_Yev2O9 zJoTdHJ-nNu-aC8@%*0Z`s{e-r8hvY*tRDh%wdNVM`La8-AXNnl&rmW%i(10+SB@O@ zJ>d~XFR46_wZtwPe^5m#6jUG1SA$3XobN1tsL z(d(H#b%hgql!Ga%LH4iCildt#xA%z02P|-9DSQM8&MzNO69na9gu0(Ao^D@tY8#li z=6-M9XU;%Bmvi?A?-{(c&jQs-V6AWG?xLJax=na$!XVt0R}H-SM(yVxTfEH2z-Z9* zPXnv4H57UY9%0bqlp4-XQXjY)VrD>XA6?q64Jq7};eN1k3@r0H+dbSH?OWsAI>~sN z%6L2LwzH|~*!+OlP9;TCRYjw?`fhBdQ?R(uH%JcT`Q~+-3}mU=P$UH*s@qsN^G|O7P|K zxv6XhO{EoOiB5C6`Fmb38~a8@S66e|h`rw%tH9VskR}7CNc7q1z>J4^779RTuX8y>P;9TGGQuE!rUo?R+qLLe6 z_NHT2xUl)=YY#@1KW+SW3m=x9TF)s3 zD1B^kOfI+Xejn7oKtU15Spw2iOcT|NH(vM>qk?}r<>!Byic zTVmxrHF7Sa7dj7m)NGjVnt;;Je9*0aE#wU=+5u1Ad4YG$oh4397w>2;pFVFp-gP+l zjhiK7+lDhhtz{m02uiN> zmA%DbBu3ZPmHI%wtCr$rS&3EZvr&Rym@X@9O&v7Ul2el+j$8j;l+$Ms%rRq{u~*MP zc=yxsQ57MCJWKlebGk~T%&vD1(&Rs=Z;X30Ge|6Wj+s@}=$>rdn(Qu#_jFe@PJ~mf zrGojV0|MD=wib39<}T0uw28njLDo@L#NyW&T9R^c#e*W>=? zul^|?^kd%d&S$dI@Q=y!$YY=fK@u;hCJ6C3=5T&4Y)%oOLViU@Kt1}X{sYYfoz^>H z(sLzCHRgHf^Ind61AX|45;ivht9c^SGlZ?kc~2GW+&Q8^G^oJMX_x4;qE3fVFS(dW z=p;8!IvjdlTK7>rWPMWto3GkH@Uog+c}MNbDUJ@edDF0Wj?KWpAb?VyOCHitJ6rV_ zi73CQc~TmV`Y-HCz+SNM=}A4<3DnA8dV<{iRXd`gH8cPxPMB6^R%AVk$d1!I0eUXo zx6?(_fEyb8lT52IeSU|q7aq{Qejf<^yAJf<8fS_O;_JTsyMtcGccy05dwT=;gVy!^ z6#jvVT>N7iU8`Q%IV+wbNla0QBY0)dN3;pd zt|zmblQiig5@iy8mHNU)zbXNGRUTySoEe@s?@{x>>s|M>yYISATGR89>N%)4exQw2 z$`p4YaS%CkWl{AQFn0|etUG^(99SQa8R-&ev5xvB0`^`(q8vYw?Yt>CJKs#B%$V7s zabGw&c@*1+o!Gq<9aF_h5N%ywe&L=e4I0%gO1h`PBv#78s+kRELtPkvDhwZ_4^+ps znAQ7I>pOT}6Z`i3q)UF$v%?N9Ui!3dF#LI&qb0cS3)yCKxA_mVTG$TQ)&DICv zokLkLyz)rehdp@}*}{>pqe}iWtqLtd1FtWiQ7mZUF5@1C%^YIl`Qk|MsshpBiQJp3 z=Szqcm=VkY860RF9QJwnd+{`xEvM}JAQUG9jdXw|MMDU~f?)gt`x{Yf>mKq)&#tF- zJb6$p4+;jKyv*8=aZMNslnBCgS;H$})pVO=UnBSA|&{ocA5gUNV7Q@`K z(g*o7@`&z!m%mN!-JN*hOn^+gY`TrIs#I9sZ|3L{jC&V_+oWfEHCrM!>p8S3^N z`SHESPFf7L<7M14JpQ@OAFfgXE95;lA@Sj>X+dq}iy|Ugm6B4U^_{BHXfGH?^Fzqz zv@$mh=8}rw77?-&Ji*Yxa)ulTTIKr$Yo=AWxjEUQ1W!uihTlEz(D2V%bq7v z`zj5WZk3ZsK;E|#p&|54ztgbD|3IqFLFrrnhT?@B$Rf5AQ}NVo!1)vN;}doki^SC8 zfUW(DUT%}@?!OAsnuANpgStz_`d#TX@D0}00?eh}Q9UW!IMR@XR zWRhW2Tj&i?bmP;P6eD7xy;+e5wDzvNEyvXfU*=>W8lzzHD6SRQ^|O@3SgLf!b>%T) zDkoe;-{3&B_BpfOT=1o-%5!IbOO$$`0CKr#{(ybj+G8}?YePv#?PJs*e@y6!zHfJu z@Sy7UjQPs7W}20{irfycfTVM-<}xI;nYM{sd_`b_p(|a4vz&>f+rm0B6JZLklJ#4` zqCHba%Jv;Bw?zZ2(nVGg7e7$hZ-*JNL2|ibhs2*{m!mP}-=N6LT7Ql@k9ZtqdTb~? zlLs9nj@=_IkJ{=z&BI7r;(YT8`TN^w_b6zg>Ys>jXWeY#Ii|$nogtt8b%y9~&~6&o z0ZjQ#s{Q6`r=9}9mj-@8*yTm!$0=ILqp$TaH1qCLAnCE5DA|^AM!rqKYL|NJw`WtH z%rBs2Q{*4aT3* z4bO=cq{Z`O0Zv+!|JSXQe-=QNU4i@Zh1u+d-v7(UqyT`CcIzey0PfsrWfM3CW}$Eq tc$gIG=P5w<&W)614fBb?=6l|jU%H{kfcoU&2My7O&58ftT+=xo_+NGsS`7dI diff --git a/web/title.png b/web/title.png deleted file mode 100644 index 637cb98375818a8de31b39d16bf0ca0547bd125c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119745 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 OpzE@UwQ(IBjr||oe+Bsf diff --git a/web/wiki.html b/web/wiki.html deleted file mode 100644 index 5193f17..0000000 --- a/web/wiki.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - -felicalib - FeliCa Library : Wiki - - - - - - - -
- - - - - - - - - -
-

Wiki

- - - - - - - -
- - -
- - - - -
- - - -
- - - From 89bc8fbe88af59f12ae7bf9f33f2d3c1b9f70152 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Fri, 21 Feb 2014 18:03:11 +0900 Subject: [PATCH 02/15] Update LICENSE --- LICENSE | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/LICENSE b/LICENSE index a62f679..e0fa8aa 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,10 @@ The MIT License (MIT) © 2014 Keiho Sakapon. +Forked from tmurakam/felicalib +https://github.com/tmurakam/felicalib +Copyright (c) 2007-2010, Takuya Murakami, All rights reserved. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to From ad050f1ca337e56e17aa74879f683da72d725e40 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Fri, 21 Feb 2014 18:10:29 +0900 Subject: [PATCH 03/15] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f6c65d1..36329b0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -## felicalib +## felicalib 改 -FeliCa access wrapper library. +FeliCa access wrapper library, forked from [tmurakam/felicalib](https://github.com/tmurakam/felicalib). From 1c75fe663a62b5a28c1fabb2f5a2f33c4b82a235 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 11:37:01 +0900 Subject: [PATCH 04/15] Update LICENSE --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index e0fa8aa..38b05f0 100644 --- a/LICENSE +++ b/LICENSE @@ -2,9 +2,9 @@ The MIT License (MIT) © 2014 Keiho Sakapon. -Forked from tmurakam/felicalib -https://github.com/tmurakam/felicalib +Forked from tmurakam/felicalib. Copyright (c) 2007-2010, Takuya Murakami, All rights reserved. +https://github.com/tmurakam/felicalib Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From b67a3f99c9d910c5872684488cb08e564412a8e2 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 11:57:29 +0900 Subject: [PATCH 05/15] Add solution and project --- .../FelicaLib_DotNet/Class1.cs | 11 ++++ .../FelicaLib_DotNet/FelicaLib_DotNet.csproj | 52 +++++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 +++++++++++++ FelicaLib_Remastered/FelicaLib_Remastered.sln | 20 +++++++ 4 files changed, 119 insertions(+) create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs create mode 100644 FelicaLib_Remastered/FelicaLib_Remastered.sln diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs b/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs new file mode 100644 index 0000000..7068f80 --- /dev/null +++ b/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FelicaLib_DotNet +{ + public class Class1 + { + } +} diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj new file mode 100644 index 0000000..b1ba954 --- /dev/null +++ b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj @@ -0,0 +1,52 @@ + + + + + Debug + AnyCPU + {CE529C49-470F-4D1C-B4E5-4B9E854D8597} + Library + Properties + FelicaLib_DotNet + FelicaLib_DotNet + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2e26b60 --- /dev/null +++ b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// アセンブリã«é–¢ã™ã‚‹ä¸€èˆ¬æƒ…å ±ã¯ä»¥ä¸‹ã®å±žæ€§ã‚»ãƒƒãƒˆã‚’ã¨ãŠã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ +// アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ +// ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 +[assembly: AssemblyTitle("FelicaLib_DotNet")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FelicaLib_DotNet")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible ã‚’ false ã«è¨­å®šã™ã‚‹ã¨ã€ãã®åž‹ã¯ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内㧠COM コンãƒãƒ¼ãƒãƒ³ãƒˆã‹ã‚‰ +// å‚ç…§ä¸å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚COM ã‹ã‚‰ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内ã®åž‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ã€ +// ãã®åž‹ã® ComVisible 属性を true ã«è¨­å®šã—ã¦ãã ã•ã„。 +[assembly: ComVisible(false)] + +// 次㮠GUID ã¯ã€ã“ã®ãƒ—ロジェクト㌠COM ã«å…¬é–‹ã•ã‚Œã‚‹å ´åˆã®ã€typelib ã® ID ã§ã™ +[assembly: Guid("6f052bdc-7d4f-47a4-969b-f08eb5a7cc2c")] + +// アセンブリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã¯ã€ä»¥ä¸‹ã® 4 ã¤ã®å€¤ã§æ§‹æˆã•ã‚Œã¦ã„ã¾ã™: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// ã™ã¹ã¦ã®å€¤ã‚’指定ã™ã‚‹ã‹ã€ä¸‹ã®ã‚ˆã†ã« '*' を使ã£ã¦ãƒ“ルドãŠã‚ˆã³ãƒªãƒ“ジョン番å·ã‚’ +// 既定値ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/FelicaLib_Remastered/FelicaLib_Remastered.sln b/FelicaLib_Remastered/FelicaLib_Remastered.sln new file mode 100644 index 0000000..e075509 --- /dev/null +++ b/FelicaLib_Remastered/FelicaLib_Remastered.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FelicaLib_DotNet", "FelicaLib_DotNet\FelicaLib_DotNet.csproj", "{CE529C49-470F-4D1C-B4E5-4B9E854D8597}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal From 889ab52a6b32fb5b1bf8fe0e31687b4ee6710ed7 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 12:18:04 +0900 Subject: [PATCH 06/15] Update project settings --- .../FelicaLib_DotNet/FelicaLib_DotNet.csproj | 8 +++++--- .../FelicaLib_DotNet/Properties/AssemblyInfo.cs | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj index b1ba954..f21ced8 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj +++ b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj @@ -7,8 +7,8 @@ {CE529C49-470F-4D1C-B4E5-4B9E854D8597} Library Properties - FelicaLib_DotNet - FelicaLib_DotNet + FelicaLib + FelicaLib v3.5 512 @@ -22,12 +22,14 @@ 4 - pdbonly + none true bin\Release\ TRACE prompt 4 + false + bin\Release\FelicaLib.xml diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs index 2e26b60..c23daec 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs +++ b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ // アセンブリã«é–¢ã™ã‚‹ä¸€èˆ¬æƒ…å ±ã¯ä»¥ä¸‹ã®å±žæ€§ã‚»ãƒƒãƒˆã‚’ã¨ãŠã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ // アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ // ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 -[assembly: AssemblyTitle("FelicaLib_DotNet")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyTitle("felicalib Remastered")] +[assembly: AssemblyDescription("FeliCa access wrapper library.")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("FelicaLib_DotNet")] -[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyCompany("Keiho Sakapon")] +[assembly: AssemblyProduct("felicalib")] +[assembly: AssemblyCopyright("© 2014 Keiho Sakapon.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // ã™ã¹ã¦ã®å€¤ã‚’指定ã™ã‚‹ã‹ã€ä¸‹ã®ã‚ˆã†ã« '*' を使ã£ã¦ãƒ“ルドãŠã‚ˆã³ãƒªãƒ“ジョン番å·ã‚’ // 既定値ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] From 062e9a30fce53d6174b74a76275fd4211423ebc3 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 12:20:42 +0900 Subject: [PATCH 07/15] Install NuGet Packup --- FelicaLib_Remastered/.nuget/packages.config | 4 ++++ .../FelicaLib_DotNet/FelicaLib_DotNet.csproj | 7 ++++++ .../FelicaLib_DotNet/NuGetPackup.exe | Bin 0 -> 13824 bytes .../FelicaLib_DotNet/Package.nuspec.xml | 20 ++++++++++++++++++ .../FelicaLib_DotNet/packages.config | 4 ++++ FelicaLib_Remastered/FelicaLib_Remastered.sln | 5 +++++ 6 files changed, 40 insertions(+) create mode 100644 FelicaLib_Remastered/.nuget/packages.config create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/NuGetPackup.exe create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/packages.config diff --git a/FelicaLib_Remastered/.nuget/packages.config b/FelicaLib_Remastered/.nuget/packages.config new file mode 100644 index 0000000..23d730d --- /dev/null +++ b/FelicaLib_Remastered/.nuget/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj index f21ced8..b5d4f16 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj +++ b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj @@ -43,6 +43,13 @@ + + + + + + + ^pni*N`O`a+X`h9s> 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 U8Uz{y8Uz{y8Uz{y{tpTK3k40OYXATM literal 0 HcmV?d00001 From d938942d95241c62bc78211b645c6c82c9374e21 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 16:53:23 +0900 Subject: [PATCH 11/15] Add original source code of felicalib for .NET --- .../FelicaLib_DotNet/Class1.cs | 11 - .../FelicaLib_DotNet/FelicaLib.cs | 288 ++++++++++++++++++ .../FelicaLib_DotNet/FelicaLib_DotNet.csproj | 6 +- 3 files changed, 293 insertions(+), 12 deletions(-) delete mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs create mode 100644 FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib.cs diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs b/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs deleted file mode 100644 index 7068f80..0000000 --- a/FelicaLib_Remastered/FelicaLib_DotNet/Class1.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace FelicaLib_DotNet -{ - public class Class1 - { - } -} diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib.cs b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib.cs new file mode 100644 index 0000000..b743363 --- /dev/null +++ b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib.cs @@ -0,0 +1,288 @@ +/* + felicalib - FeliCa access wrapper library + + Copyright (c) 2007-2010, Takuya Murakami, All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/// +/// Porting to x64 systems by DeForest(Hirokazu Hayashi) +/// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Reflection; + +namespace FelicaLib +{ + /// + /// DLLé…延ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚¯ãƒ©ã‚¹ + /// + public class BindDLL : IDisposable + { + [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPWStr)] string lpFileName); + [DllImport("kernel32", SetLastError = true)] + private static extern bool FreeLibrary(IntPtr hModule); + [DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)] + private static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName); + + private IntPtr _pModule; + + /// + /// DLLã®ãƒ­ãƒ¼ãƒ‰ãƒ»ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆç”Ÿæˆ + /// + /// ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹DLLå + public BindDLL(string szFilename) + { + _pModule = BindDLL.LoadLibrary(szFilename); + if (_pModule != IntPtr.Zero) + { + return; + } + int nResult = Marshal.GetHRForLastWin32Error(); + throw Marshal.GetExceptionForHR(nResult); + } + + /// + /// 指定åã®ã‚¢ãƒ³ãƒžãƒãƒ¼ã‚¸é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã‚’デリゲートã«å¤‰æ› + /// + /// アンマãƒãƒ¼ã‚¸é–¢æ•°å + /// 変æ›ã™ã‚‹ãƒ‡ãƒªã‚²ãƒ¼ãƒˆã®Type + /// 変æ›ã—ãŸãƒ‡ãƒªã‚²ãƒ¼ãƒˆ + public Delegate GetDelegate(string szProcName, Type typDelegate) + { + IntPtr pProc = BindDLL.GetProcAddress(_pModule, szProcName); + if (pProc != IntPtr.Zero) + { + Delegate oDG = Marshal.GetDelegateForFunctionPointer(pProc, typDelegate); + return oDG; + } + int nResult = Marshal.GetHRForLastWin32Error(); + throw Marshal.GetExceptionForHR(nResult); + } + + #region IDisposable メンム+ + public void Dispose() + { + if (_pModule != IntPtr.Zero) + { + BindDLL.FreeLibrary(_pModule); + } + } + + #endregion + } + + // システムコード + enum SystemCode : int + { + Any = 0xffff, // ANY + Common = 0xfe00, // 共通領域 + Cyberne = 0x0003, // サイãƒãƒé ˜åŸŸ + + Edy = 0xfe00, // Edy (=共通領域) + Suica = 0x0003, // Suica (=サイãƒãƒé ˜åŸŸ) + QUICPay = 0x04c1, // QUICPay + } + + public class Felica : IDisposable + { + // é…延ロード用Delegate定義 + private delegate IntPtr Pasori_open(String dummy); + private delegate int Pasori_close(IntPtr p); + private delegate int Pasori_init(IntPtr p); + private delegate IntPtr Felica_polling(IntPtr p, ushort systemcode, byte rfu, byte time_slot); + private delegate void Felica_free(IntPtr f); + private delegate void Felica_getidm(IntPtr f, byte[] data); + private delegate void Felica_getpmm(IntPtr f, byte[] data); + private delegate int Felica_read_without_encryption02(IntPtr f, int servicecode, int mode, byte addr, byte[] data); + + // é…延ロード用Delegate + private Pasori_open pasori_open = null; + private Pasori_close pasori_close = null; + private Pasori_init pasori_init = null; + private Felica_polling felica_polling = null; + private Felica_free felica_free = null; + private Felica_getidm felica_getidm = null; + private Felica_getpmm felica_getpmm = null; + private Felica_read_without_encryption02 felica_read_without_encryption02 = null; + + private string szDLLname = ""; + private BindDLL bdDLL = null; + + private IntPtr pasorip = IntPtr.Zero; + private IntPtr felicap = IntPtr.Zero; + + /// + /// コンストラクタ + /// + public Felica() + { + // x64対応 20100501 - DeForest + try + { + // プラットフォーム別ã®ãƒ­ãƒ¼ãƒ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«å決定(x64/x86サãƒãƒ¼ãƒˆã€Iteniumã¯ã‚µãƒãƒ¼ãƒˆå¤–) + if (System.IntPtr.Size >= 8) // x64 + { + szDLLname = "felicalib64.dll"; + } + else // x86 + { + szDLLname = "felicalib.dll"; + } + // DLLロード + bdDLL = new BindDLL(szDLLname); + // エントリーå–å¾— + pasori_open = (Pasori_open)bdDLL.GetDelegate("pasori_open", typeof(Pasori_open)); + pasori_close = (Pasori_close)bdDLL.GetDelegate("pasori_close", typeof(Pasori_close)); + pasori_init = (Pasori_init)bdDLL.GetDelegate("pasori_init", typeof(Pasori_init)); + felica_polling = (Felica_polling)bdDLL.GetDelegate("felica_polling", typeof(Felica_polling)); + felica_free = (Felica_free)bdDLL.GetDelegate("felica_free", typeof(Felica_free)); + felica_getidm = (Felica_getidm)bdDLL.GetDelegate("felica_getidm", typeof(Felica_getidm)); + felica_getpmm = (Felica_getpmm)bdDLL.GetDelegate("felica_getpmm", typeof(Felica_getpmm)); + felica_read_without_encryption02 = (Felica_read_without_encryption02)bdDLL.GetDelegate("felica_read_without_encryption02", typeof(Felica_read_without_encryption02)); + } + catch (Exception) + { + throw new Exception(szDLLname + " をロードã§ãã¾ã›ã‚“"); + } + + pasorip = pasori_open(null); + if (pasorip == IntPtr.Zero) + { + throw new Exception(szDLLname + " ã‚’é–‹ã‘ã¾ã›ã‚“"); + } + if (pasori_init(pasorip) != 0) + { + throw new Exception("PaSoRi ã«æŽ¥ç¶šã§ãã¾ã›ã‚“"); + } + } + + #region IDisposable メンム+ + /// + /// ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆç ´æ£„æ™‚å‡¦ç† + /// + public void Dispose() + { + if (pasorip != IntPtr.Zero) + { + pasori_close(pasorip); + pasorip = IntPtr.Zero; + } + if (bdDLL != null) + { + bdDLL = null; + } + } + + #endregion + + /// + /// デストラクタ + /// + ~Felica() + { + Dispose(); + } + + /// + /// ãƒãƒ¼ãƒªãƒ³ã‚° + /// + /// システムコード + public void Polling(int systemcode) + { + felica_free(felicap); + + felicap = felica_polling(pasorip, (ushort)systemcode, 0, 0); + if (felicap == IntPtr.Zero) + { + throw new Exception("カード読ã¿å–り失敗"); + } + } + + /// + /// IDmå–å¾— + /// + /// IDmãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ + public byte[] IDm() + { + if (felicap == IntPtr.Zero) + { + throw new Exception("no polling executed."); + } + + byte[] buf = new byte[8]; + felica_getidm(felicap, buf); + return buf; + } + + /// + /// PMmå–å¾— + /// + /// PMmãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ + public byte[] PMm() + { + if (felicap == IntPtr.Zero) + { + throw new Exception("no polling executed."); + } + + byte[] buf = new byte[8]; + felica_getpmm(felicap, buf); + return buf; + } + + /// + /// éžæš—å·åŒ–領域読ã¿è¾¼ã¿ + /// + /// サービスコード + /// アドレス + /// データ + public byte[] ReadWithoutEncryption(int servicecode, int addr) + { + if (felicap == IntPtr.Zero) + { + throw new Exception("no polling executed."); + } + + byte[] data = new byte[16]; + int ret = felica_read_without_encryption02(felicap, servicecode, 0, (byte)addr, data); + if (ret != 0) + { + return null; + } + return data; + } + } +} diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj index 3eee127..1d74d29 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj +++ b/FelicaLib_Remastered/FelicaLib_DotNet/FelicaLib_DotNet.csproj @@ -40,10 +40,14 @@ - + + + felicalib.dll + PreserveNewest + From 1e714adeb0c6f2a109edfa78a6fa0660406c17fd Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 17:28:00 +0900 Subject: [PATCH 12/15] Add unit test projects --- FelicaLib_Remastered/FelicaLib_Remastered.sln | 12 +++ .../UnitTest35/Properties/AssemblyInfo.cs | 36 ++++++++ FelicaLib_Remastered/UnitTest35/UnitTest1.cs | 14 +++ .../UnitTest35/UnitTest35.csproj | 86 +++++++++++++++++++ .../UnitTest45/Properties/AssemblyInfo.cs | 36 ++++++++ FelicaLib_Remastered/UnitTest45/UnitTest1.cs | 14 +++ .../UnitTest45/UnitTest45.csproj | 83 ++++++++++++++++++ 7 files changed, 281 insertions(+) create mode 100644 FelicaLib_Remastered/UnitTest35/Properties/AssemblyInfo.cs create mode 100644 FelicaLib_Remastered/UnitTest35/UnitTest1.cs create mode 100644 FelicaLib_Remastered/UnitTest35/UnitTest35.csproj create mode 100644 FelicaLib_Remastered/UnitTest45/Properties/AssemblyInfo.cs create mode 100644 FelicaLib_Remastered/UnitTest45/UnitTest1.cs create mode 100644 FelicaLib_Remastered/UnitTest45/UnitTest45.csproj diff --git a/FelicaLib_Remastered/FelicaLib_Remastered.sln b/FelicaLib_Remastered/FelicaLib_Remastered.sln index d26acbb..0c9795c 100644 --- a/FelicaLib_Remastered/FelicaLib_Remastered.sln +++ b/FelicaLib_Remastered/FelicaLib_Remastered.sln @@ -8,6 +8,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D6B5A5 .nuget\packages.config = .nuget\packages.config EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest35", "UnitTest35\UnitTest35.csproj", "{2D4B5C5D-B84D-4DC6-8A02-7962638199EE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest45", "UnitTest45\UnitTest45.csproj", "{C7040AF5-FAF6-4289-836A-BD3CF051AF7E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,6 +22,14 @@ Global {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Debug|Any CPU.Build.0 = Debug|Any CPU {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE529C49-470F-4D1C-B4E5-4B9E854D8597}.Release|Any CPU.Build.0 = Release|Any CPU + {2D4B5C5D-B84D-4DC6-8A02-7962638199EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D4B5C5D-B84D-4DC6-8A02-7962638199EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D4B5C5D-B84D-4DC6-8A02-7962638199EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D4B5C5D-B84D-4DC6-8A02-7962638199EE}.Release|Any CPU.Build.0 = Release|Any CPU + {C7040AF5-FAF6-4289-836A-BD3CF051AF7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7040AF5-FAF6-4289-836A-BD3CF051AF7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7040AF5-FAF6-4289-836A-BD3CF051AF7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7040AF5-FAF6-4289-836A-BD3CF051AF7E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FelicaLib_Remastered/UnitTest35/Properties/AssemblyInfo.cs b/FelicaLib_Remastered/UnitTest35/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..11c7cdd --- /dev/null +++ b/FelicaLib_Remastered/UnitTest35/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// アセンブリã«é–¢ã™ã‚‹ä¸€èˆ¬æƒ…å ±ã¯ä»¥ä¸‹ã®å±žæ€§ã‚»ãƒƒãƒˆã‚’ã¨ãŠã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ +// アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ +// ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 +[assembly: AssemblyTitle("UnitTest35")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTest35")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible ã‚’ false ã«è¨­å®šã™ã‚‹ã¨ã€ãã®åž‹ã¯ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内㧠COM コンãƒãƒ¼ãƒãƒ³ãƒˆã‹ã‚‰ +// å‚ç…§ã§ããªããªã‚Šã¾ã™ã€‚ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内㧠COM ã‹ã‚‰åž‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€ +// ãã®åž‹ã® ComVisible 属性を true ã«è¨­å®šã—ã¦ãã ã•ã„。 +[assembly: ComVisible(false)] + +// ã“ã®ãƒ—ロジェクト㌠COM ã«å…¬é–‹ã•ã‚Œã‚‹å ´åˆã€æ¬¡ã® GUID ãŒã‚¿ã‚¤ãƒ— ライブラリ㮠ID ã«ãªã‚Šã¾ã™ã€‚ +[assembly: Guid("42fb4e50-93fd-4d02-9776-5ef491d269b0")] + +// アセンブリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã¯ã€ä»¥ä¸‹ã® 4 ã¤ã®å€¤ã§æ§‹æˆã•ã‚Œã¦ã„ã¾ã™: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// ã™ã¹ã¦ã®å€¤ã‚’指定ã™ã‚‹ã‹ã€ä»¥ä¸‹ã®ã‚ˆã†ã« '*' を使用ã—ã¦ãƒ“ルド番å·ã¨ãƒªãƒ“ジョン番å·ã‚’ +// 既定値ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/FelicaLib_Remastered/UnitTest35/UnitTest1.cs b/FelicaLib_Remastered/UnitTest35/UnitTest1.cs new file mode 100644 index 0000000..089371e --- /dev/null +++ b/FelicaLib_Remastered/UnitTest35/UnitTest1.cs @@ -0,0 +1,14 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace UnitTest35 +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestMethod1() + { + } + } +} diff --git a/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj b/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj new file mode 100644 index 0000000..d2f9e90 --- /dev/null +++ b/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj @@ -0,0 +1,86 @@ + + + + Debug + AnyCPU + {2D4B5C5D-B84D-4DC6-8A02-7962638199EE} + Library + Properties + UnitTest35 + UnitTest35 + v3.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/FelicaLib_Remastered/UnitTest45/Properties/AssemblyInfo.cs b/FelicaLib_Remastered/UnitTest45/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dba81d5 --- /dev/null +++ b/FelicaLib_Remastered/UnitTest45/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// アセンブリã«é–¢ã™ã‚‹ä¸€èˆ¬æƒ…å ±ã¯ä»¥ä¸‹ã®å±žæ€§ã‚»ãƒƒãƒˆã‚’ã¨ãŠã—ã¦åˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚ +// アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ +// ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 +[assembly: AssemblyTitle("UnitTest45")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTest45")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible ã‚’ false ã«è¨­å®šã™ã‚‹ã¨ã€ãã®åž‹ã¯ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内㧠COM コンãƒãƒ¼ãƒãƒ³ãƒˆã‹ã‚‰ +// å‚ç…§ã§ããªããªã‚Šã¾ã™ã€‚ã“ã®ã‚¢ã‚»ãƒ³ãƒ–リ内㧠COM ã‹ã‚‰åž‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€ +// ãã®åž‹ã® ComVisible 属性を true ã«è¨­å®šã—ã¦ãã ã•ã„。 +[assembly: ComVisible(false)] + +// ã“ã®ãƒ—ロジェクト㌠COM ã«å…¬é–‹ã•ã‚Œã‚‹å ´åˆã€æ¬¡ã® GUID ãŒã‚¿ã‚¤ãƒ— ライブラリ㮠ID ã«ãªã‚Šã¾ã™ã€‚ +[assembly: Guid("ff376044-4616-485f-b959-efa80f21c182")] + +// アセンブリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã¯ã€ä»¥ä¸‹ã® 4 ã¤ã®å€¤ã§æ§‹æˆã•ã‚Œã¦ã„ã¾ã™: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// ã™ã¹ã¦ã®å€¤ã‚’指定ã™ã‚‹ã‹ã€ä»¥ä¸‹ã®ã‚ˆã†ã« '*' を使用ã—ã¦ãƒ“ルド番å·ã¨ãƒªãƒ“ジョン番å·ã‚’ +// 既定値ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/FelicaLib_Remastered/UnitTest45/UnitTest1.cs b/FelicaLib_Remastered/UnitTest45/UnitTest1.cs new file mode 100644 index 0000000..9a19fa6 --- /dev/null +++ b/FelicaLib_Remastered/UnitTest45/UnitTest1.cs @@ -0,0 +1,14 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace UnitTest45 +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestMethod1() + { + } + } +} diff --git a/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj b/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj new file mode 100644 index 0000000..4a8ae53 --- /dev/null +++ b/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj @@ -0,0 +1,83 @@ + + + + Debug + AnyCPU + {C7040AF5-FAF6-4289-836A-BD3CF051AF7E} + Library + Properties + UnitTest45 + UnitTest45 + v4.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file From 33a2fc3ba0ee13d4a5ced4767f6b725b98605929 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 20:01:03 +0900 Subject: [PATCH 13/15] Add test methods. --- FelicaLib_Remastered/UnitTest35/FelicaTest.cs | 36 +++++++++++++++++++ FelicaLib_Remastered/UnitTest35/UnitTest1.cs | 14 -------- .../UnitTest35/UnitTest35.csproj | 8 ++++- FelicaLib_Remastered/UnitTest45/FelicaTest.cs | 36 +++++++++++++++++++ FelicaLib_Remastered/UnitTest45/UnitTest1.cs | 14 -------- .../UnitTest45/UnitTest45.csproj | 8 ++++- 6 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 FelicaLib_Remastered/UnitTest35/FelicaTest.cs delete mode 100644 FelicaLib_Remastered/UnitTest35/UnitTest1.cs create mode 100644 FelicaLib_Remastered/UnitTest45/FelicaTest.cs delete mode 100644 FelicaLib_Remastered/UnitTest45/UnitTest1.cs diff --git a/FelicaLib_Remastered/UnitTest35/FelicaTest.cs b/FelicaLib_Remastered/UnitTest35/FelicaTest.cs new file mode 100644 index 0000000..8babb3b --- /dev/null +++ b/FelicaLib_Remastered/UnitTest35/FelicaTest.cs @@ -0,0 +1,36 @@ +using FelicaLib; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Linq; +using System.Text; + +namespace UnitTest35 +{ + [TestClass] + public class FelicaTest + { + // Edy 残高 + const int SystemCode = 0xFE00; + const int ServiceCode = 0x1317; + const int Address = 0; + static readonly Func ToSemanticData = b => Enumerable.Range(0, 4).Select(i => b[i] * (int)Math.Pow(256, i)).Sum(); + const int Expected = 12345; + + [TestMethod] + public void ReadWithoutEncryption_1() + { + var target = ReadData(); + Assert.AreEqual(Expected, target); + } + + static object ReadData() + { + using (var felica = new Felica()) + { + felica.Polling(SystemCode); + var data = felica.ReadWithoutEncryption(ServiceCode, Address); + return ToSemanticData(data); + } + } + } +} diff --git a/FelicaLib_Remastered/UnitTest35/UnitTest1.cs b/FelicaLib_Remastered/UnitTest35/UnitTest1.cs deleted file mode 100644 index 089371e..0000000 --- a/FelicaLib_Remastered/UnitTest35/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace UnitTest35 -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} diff --git a/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj b/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj index d2f9e90..666ba98 100644 --- a/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj +++ b/FelicaLib_Remastered/UnitTest35/UnitTest35.csproj @@ -53,9 +53,15 @@ - + + + + {ce529c49-470f-4d1c-b4e5-4b9e854d8597} + FelicaLib_DotNet + + diff --git a/FelicaLib_Remastered/UnitTest45/FelicaTest.cs b/FelicaLib_Remastered/UnitTest45/FelicaTest.cs new file mode 100644 index 0000000..ebdde90 --- /dev/null +++ b/FelicaLib_Remastered/UnitTest45/FelicaTest.cs @@ -0,0 +1,36 @@ +using FelicaLib; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Linq; +using System.Text; + +namespace UnitTest45 +{ + [TestClass] + public class FelicaTest + { + // Edy 残高 + const int SystemCode = 0xFE00; + const int ServiceCode = 0x1317; + const int Address = 0; + static readonly Func ToSemanticData = b => Enumerable.Range(0, 4).Select(i => b[i] * (int)Math.Pow(256, i)).Sum(); + const int Expected = 12345; + + [TestMethod] + public void ReadWithoutEncryption_1() + { + var target = ReadData(); + Assert.AreEqual(Expected, target); + } + + static object ReadData() + { + using (var felica = new Felica()) + { + felica.Polling(SystemCode); + var data = felica.ReadWithoutEncryption(ServiceCode, Address); + return ToSemanticData(data); + } + } + } +} diff --git a/FelicaLib_Remastered/UnitTest45/UnitTest1.cs b/FelicaLib_Remastered/UnitTest45/UnitTest1.cs deleted file mode 100644 index 9a19fa6..0000000 --- a/FelicaLib_Remastered/UnitTest45/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace UnitTest45 -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} diff --git a/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj b/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj index 4a8ae53..b1d9713 100644 --- a/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj +++ b/FelicaLib_Remastered/UnitTest45/UnitTest45.csproj @@ -50,9 +50,15 @@ - + + + + {ce529c49-470f-4d1c-b4e5-4b9e854d8597} + FelicaLib_DotNet + + From f1029b7792e12a19b7e30a4ba57f309153be9134 Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 22:13:12 +0900 Subject: [PATCH 14/15] Update NuSpec file --- FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml b/FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml index 5940d7f..0672889 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml +++ b/FelicaLib_Remastered/FelicaLib_DotNet/Package.nuspec.xml @@ -10,11 +10,13 @@ https://github.com/sakapon/felicalib-remastered false $description$ - Remastered felicalib. + Make the library available on NuGet. $copyright$ - FeliCa + FeliCa PaSoRi - + + + \ No newline at end of file From 995ccd38c08c56cd15b3652950229c34f284f06d Mon Sep 17 00:00:00 2001 From: Keiho Sakapon Date: Sun, 2 Mar 2014 22:36:55 +0900 Subject: [PATCH 15/15] Create NuGet package --- .../FelicaLib_DotNet/Properties/AssemblyInfo.cs | 3 ++- Published/FelicaLib.DotNet.1.1.0.0.nupkg | Bin 0 -> 39648 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Published/FelicaLib.DotNet.1.1.0.0.nupkg diff --git a/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs index c23daec..3aebdcb 100644 --- a/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs +++ b/FelicaLib_Remastered/FelicaLib_DotNet/Properties/AssemblyInfo.cs @@ -6,7 +6,8 @@ // アセンブリã«é–¢é€£ä»˜ã‘られã¦ã„る情報を変更ã™ã‚‹ã«ã¯ã€ // ã“れらã®å±žæ€§å€¤ã‚’変更ã—ã¦ãã ã•ã„。 [assembly: AssemblyTitle("felicalib Remastered")] -[assembly: AssemblyDescription("FeliCa access wrapper library.")] +[assembly: AssemblyDescription(@"FeliCa access wrapper library. +プロジェクトã«è¿½åŠ ã•ã‚ŒãŸ felicalib.dll ã®ãƒ—ロパティを開ãã€[出力ディレクトリã«ã‚³ãƒ”ー] ã‚’ [æ–°ã—ã„å ´åˆã¯ã‚³ãƒ”ーã™ã‚‹] ã«è¨­å®šã—ã¦ãã ã•ã„。")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Keiho Sakapon")] [assembly: AssemblyProduct("felicalib")] diff --git a/Published/FelicaLib.DotNet.1.1.0.0.nupkg b/Published/FelicaLib.DotNet.1.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..e405e935c29da0816e9d19bd315c528173bf02c8 GIT binary patch literal 39648 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 literal 0 HcmV?d00001