powered by nequal
Home » HTTP_Download_Mobile_EZget » Timeline » 1680

Changeset 1680 -- 2010-02-27 21:58:23

Comment
[Package Release] HTTP_Download_Mobile_EZget

Diffs

HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/HTTP_Download_Mobile_EZgetTest.php

@@ -0,0 +1,227 @@
+<?php
+require_once 'PHPUnit/Framework.php';
+require_once 'HTTP/Download/Mobile/EZget.php';
+
+require_once 'HTTP/Request2.php';
+require_once 'Net/URL2.php';
+require_once 'MIME/Type.php';
+
+
+class HTTP_Download_Mobile_EZgetTestCase extends PHPUnit_Framework_TestCase
+{
+    public function testGetResponseType()
+    {
+        $ezget = new HTTP_Download_Mobile_EZget();
+
+        $data = array(
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => 0,
+                'count'    => 120,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING,
+            ),
+            array(
+                'filename' => 'dummy.jpg',
+                'offset'   => 0,
+                'count'    => 120,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => 0,
+                'count'    => 0,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => -1,
+                'count'    => -1,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => -1,
+                'count'    => -2,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_FAILED,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => -2,
+                'count'    => -2,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => null,
+                'count'    => null,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+            array(
+                'filename' => 'dummy.jpg',
+                'offset'   => null,
+                'count'    => null,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => '0',
+                'count'    => '0',
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => '0',
+                'count'    => '120',
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => 0,
+                'count'    => 120.3,
+                'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+            ),
+        );
+        foreach ($data as $value) {
+            $actual = $ezget->getResponseType($value['offset'], $value['count'], $value['filename']);
+            $this->assertEquals($value['response'], $actual);
+        }
+    }
+
+    public function testGetResponseMessage()
+    {
+        $ezget = new HTTP_Download_Mobile_EZget();
+
+        $messages = array(
+            HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN       => '1',
+            HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING   => '2',
+            HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY => '3',
+            HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED     => '4',
+            HTTP_Download_Mobile_EZget::RESPONSE_FAILED        => '5',
+            HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND  => '6',
+        );
+        foreach ($messages as $response_type => $message) {
+            $ezget->setResponseMessage($response_type, $message);
+        }
+
+        foreach ($messages as $response_type => $expect) {
+            $actual = $ezget->getResponseMessage($response_type);
+            $this->assertEquals($actual,$expect);
+        }
+    }
+
+    public function testGetResponse()
+    {
+        $ezget = new HTTP_Download_Mobile_EZget();
+
+        $data = array(
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => 0,
+                'count'    => 120,
+                'response' => file_get_contents(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg', 0, null, 0, 120),
+            ),
+            array(
+                'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+                'offset'   => '0',
+                'count'    => '120',
+                'response' => file_get_contents(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg', 0, null, 0, 120),
+            ),
+            array(
+                'filename' => 'dummy.jpg',
+                'offset'   => 0,
+                'count'    => 120,
+                'response' => implode("\n", array(
+                                          '<hdml version=3.0 ttl="0" public=true>',
+                                          '<display>',
+                                          '<action type=accept task=cancel>',
+                                          '<wrap>'.mb_convert_encoding('ファイルが見つかりません', 'shift-jis', 'UTF-8').'</wrap>',
+                                          '</display>',
+                                          '</hdml>',
+                                      )),
+            ),
+            array(
+                'filename' => 'dummy.jpg',
+                'offset'   => null,
+                'count'    => null,
+                'response' => implode("\n", array(
+                                          '<hdml version=3.0 ttl="0" public=true>',
+                                          '<display>',
+                                          '<action type=accept task=cancel>',
+                                          '<wrap>'.mb_convert_encoding('エラーが発生しました', 'shift-jis', 'UTF-8').'</wrap>',
+                                          '</display>',
+                                          '</hdml>',
+                                      )),
+            ),
+        );
+        foreach ($data as $value) {
+            $response = $ezget->setFilename($value['filename'])
+                              ->setOffset($value['offset'])
+                              ->setCount($value['count'])
+                              ->getResponse();
+
+            $this->assertEquals($value['response'], $response['body']);
+        }
+    }
+
+    public function testBaseic()
+    {
+        try {
+            $filesize = filesize(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg');
+
+            $response = null;
+            $step = 0;
+
+            $offset = 0;
+            do {
+                if ($offset == $filesize) {
+                    $offset = -1;
+                    $count  = -1;
+                } else {
+                    if ($filesize - $offset < 1280) {
+                        $count = $filesize - $offset;
+                    } else {
+                        $count = 1280;
+                    }
+                }
+
+                echo sprintf('offset = %6d, count = %6d', $offset, $count).PHP_EOL;
+
+
+                $_REQUEST['name']   = 'picture.jpg';
+                $_REQUEST['offset'] = (string)$offset;
+                $_REQUEST['count']  = (string)$count;
+                $response = $this->_server();
+
+
+                if (MIME_Type::stripParameters($response['content-type']) === 'text/x-hdml') {
+                    break;
+                } else {
+                    $len = strlen($response['body']);
+                    $this->assertEquals($count, $len);
+
+                    $offset += $len;
+                }
+            } while (++$step < 10000);
+
+            $this->assertEquals('text/x-hdml',
+                                MIME_Type::stripParameters($response['content-type']));
+
+        } catch (HTTP_Request2_Exception $e) {
+            $this->fail($e->getMessage());
+        }
+    }
+
+    private function _server()
+    {
+        require_once 'HTTP/Download.php';
+
+        $ezget = new HTTP_Download_Mobile_EZget();
+
+        $response = $ezget->setFilename(isset($_REQUEST['name']) ? HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/'.$_REQUEST['name'] : null)
+                          ->setOffset(isset($_REQUEST['offset']) ? $_REQUEST['offset'] : null)
+                          ->setCount(isset($_REQUEST['count']) ? $_REQUEST['count'] : null)
+                          ->getResponse();
+
+        return $response;
+    }
+}
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/HTTP_Download_Mobile_EZgetTest.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF

HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/bootstrap.php

@@ -0,0 +1,17 @@
+<?php
+
+
+mb_language('ja');
+mb_internal_encoding('UTF-8');
+
+if (defined('E_DEPRECATED')) {
+    error_reporting(E_ALL & ~E_DEPRECATED);
+} else {
+    error_reporting(E_ALL);
+}
+
+set_include_path(realpath(dirname(__FILE__) . '/../src') . PATH_SEPARATOR .
+                 get_include_path());
+
+
+define ('HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR', dirname(__FILE__).'/data');
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/bootstrap.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF

HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/data/picture.jpg

表示できません: バイナリ形式としてマークされたファイルです。
svn:mime-type = application/octet-stream
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/data/picture.jpg
___________________________________________________________________
名前: svn:mime-type
+ application/octet-stream

HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/server.php

@@ -0,0 +1,19 @@
+<?php
+
+require_once dirname(__FILE__).'/bootstrap.php';
+require_once dirname(__FILE__).'/../src/HTTP/Download/Mobile/EZget.php';
+require_once 'HTTP/Download.php';
+
+
+$ezget = new HTTP_Download_Mobile_EZget();
+
+$response = $ezget->setFilename(isset($_REQUEST['name']) ? HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/'.$_REQUEST['name'] : null)
+                  ->setOffset(isset($_REQUEST['offset']) ? $_REQUEST['offset'] : null)
+                  ->setCount(isset($_REQUEST['count']) ? $_REQUEST['count'] : null)
+                  ->getResponse();
+
+$download = new HTTP_Download();
+$download->setContentType($response['content-type']);
+$download->setData($response['body']);
+$download->setCache(false);
+$download->send();
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/server.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF

HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/src/HTTP/Download/Mobile/EZget.php

@@ -0,0 +1,184 @@
+<?php
+
+
+/**
+ * @see http://www.au.kddi.com/ezfactory/tec/dlcgi/download_1.html
+ */
+class HTTP_Download_Mobile_EZget
+{
+    const RESPONSE_UNKNOWN       = 0;
+    const RESPONSE_DOWNLOADING   = 1;
+    const RESPONSE_DOWNLOADEMPTY = 2;
+    const RESPONSE_COMPLETED     = 3;
+    const RESPONSE_FAILED        = 4;
+    const RESPONSE_FILENOTFOUND  = 5;
+
+
+    protected $filename;
+
+    protected $offset;
+
+    protected $count;
+
+    protected $messages;
+
+
+    function __construct()
+    {
+        $this->reset();
+    }
+
+    /**
+     * 出力ファイルを設定
+     */
+    public function setFilename($filename)
+    {
+        $this->filename = $filename;
+
+        return $this;
+    }
+
+    /**
+     * offsetパラメータを設定
+     */
+    public function setOffset($offset)
+    {
+        if (preg_match('/\d+/', $offset)) {
+            $offset = (int)$offset;
+        }
+        $this->offset = $offset;
+
+        return $this;
+    }
+
+    /**
+     * countパラメータを設定
+     */
+    public function setCount($count)
+    {
+        if (preg_match('/\d+/', $count)) {
+            $count = (int)$count;
+        }
+        $this->count = $count;
+
+        return $this;
+    }
+
+    /**
+     * レスポンスを取得
+     */
+    public function getResponse()
+    {
+        $content_type  = '';
+        $response_body = '';
+
+        // 出力の種類を判別
+        $response_type = $this->getResponseType($this->offset, $this->count, $this->filename);
+
+        if ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING) {
+            $body = '';
+            if ($fp = fopen($this->filename, 'rb')) {
+                fseek($fp, $this->offset);
+                $body = fread($fp, $this->count);
+                fclose($fp);
+            }
+
+            $content_type  = 'application/x-up-download';
+            $response_body = $body;
+        } elseif ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY) {
+            $content_type  = 'application/x-up-download';
+            $response_body = '';
+        } else {
+            if ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED) {
+                $task = 'return';
+            } else {
+                $task = 'cancel';
+            }
+
+            $msg = $this->getResponseMessage($response_type);
+            $body = sprintf('<hdml version=3.0 ttl="0" public=true>'."\n".
+                            '<display>'."\n".
+                            '<action type=accept task=%s>'."\n".
+                            '<wrap>%s</wrap>'."\n".
+                            '</display>'."\n".
+                            '</hdml>',
+                            $task, $msg);
+            $body = mb_convert_encoding($body, 'SJIS', 'UTF-8');
+
+            $content_type  = 'text/x-hdml;charset=Shift_JIS';
+            $response_body = $body;
+        }
+
+
+        return array(
+            'content-type' => $content_type,
+            'body'         => $response_body,
+        );
+    }
+
+    /**
+     * レスポンスの種類を判別
+     */
+    public function getResponseType($offset, $count, $filename)
+    {
+        if (gettype($offset) !== 'integer' || gettype($count) !== 'integer') {
+            $response_type = HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN;
+        } else {
+            if ($offset >= 0 && $count > 0) {
+                if (file_exists($filename)) {
+                    $response_type = HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING;
+                } else {
+                    $response_type = HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND;
+                }
+            } elseif ($offset === 0 && $count === 0) {
+                $response_type = HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY;
+            } elseif ($offset === -1 && $count === -1) {
+                $response_type = HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED;
+            } elseif ($offset === -1 && $count === -2) {
+                $response_type = HTTP_Download_Mobile_EZget::RESPONSE_FAILED;
+            } else {
+                $response_type = HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN;
+            }
+        }
+
+        return $response_type;
+    }
+
+    /**
+     * 各値を初期値にリセットする
+     */
+    public function reset()
+    {
+        $this->filename = '';
+        $this->offset   = 0;
+        $this->count    = 0;
+
+        $messages = array(
+            HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN       => 'エラーが発生しました',
+            HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING   => null,
+            HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY => null,
+            HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED     => 'ダウンロード成功しました',
+            HTTP_Download_Mobile_EZget::RESPONSE_FAILED        => 'ダウンロード失敗しました',
+            HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND  => 'ファイルが見つかりません',
+        );
+        foreach ($messages as $response_type => $message) {
+            $this->setResponseMessage($response_type, $message);
+        }
+    }
+
+    /**
+     * レスポンスメッセージを取得する
+     */
+    public function getResponseMessage($response_type)
+    {
+        return $this->messages[$response_type];
+    }
+
+    /**
+     * レスポンスメッセージを設定する
+     */
+    public function setResponseMessage($response_type, $message)
+    {
+        return $this->messages[$response_type] = $message;
+    }
+}
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/src/HTTP/Download/Mobile/EZget.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF