393d6c9d6731bc353789a22a94fd753a9847886f
[webgit] / src / object_blob.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007, 2008,         Christian Thaeter <ct@pipapo.org>
6
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Affero General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Affero General Public License for more details.
16
17   You should have received a copy of the GNU Affero General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "object.h"
22
23 /*
24   Display blobs
25 */
26 static Html
27 webgit_object_blob_menu_action (struct webgit_repo_info* repo, unsigned char* sha1, void* buf, unsigned long size)
28 {
29   (void) repo;
30   (void) sha1;
31   (void) buf;
32   (void) size;
33   return html ("TODO: blob-object sidebar");
34 }
35
36 static Html
37 webgit_object_blob_content_action (struct webgit_repo_info* repo, unsigned char* sha1, void* buf, unsigned long size)
38 {
39   (void) sha1;
40
41   if (!memchr(buf, 0, size>8192 ? 8192 : size))
42     {
43       return html (html_tag ("pre"), html_strndup (buf, size));
44     }
45   else
46     {
47       struct webgit_query* query = repo->query;
48       const char* mimetype = webgit_mimetype (query->path);
49
50       Html ret;
51
52       if (mimetype && !strncmp(mimetype, "image/", 6))
53         {
54           /* inline image */
55           ret = html (
56                       html_tag ("img",
57                                 html_attr ("src",
58                                            html_fmt ("%s?repo=%s&action=raw&object=%s&path=%s",
59                                                      query->request->script_name,
60                                                      query->repo, query->object, query->path)
61                                            ),
62                                 html_attr ("alt", query->path ? query->path : query->object)
63                                 )
64                       );
65         }
66       else
67         {
68           /* link to raw data */
69           ret = html ("binary blob");
70         }
71       free ((char*)mimetype);
72
73       return ret;
74     }
75 }
76
77
78 Html
79 webgit_object_blob_action (struct webgit_repo_info* repo, unsigned char* sha1)
80 {
81   void* buf;
82   unsigned long size;
83
84   buf = read_object_with_reference (sha1, "blob", &size, NULL);
85
86   return html(
87               html(html_tag("div", html_attr("id", "sub-menu")), webgit_object_blob_menu_action (repo, sha1, buf, size)), html_nl (),
88               html(html_tag("div", html_attr("id", "content")), webgit_object_blob_content_action (repo, sha1, buf, size)), html_nl ()
89               );
90 }
91
92 /*
93 //      Local Variables:
94 //      mode: C
95 //      c-file-style: "gnu"
96 //      indent-tabs-mode: nil
97 //      End:
98 */